[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Lost] iso9660
Im zitieren Code die Änderungen, die es braucht, um auf LOST überhaupt mal
kompiliert zu werden. Außerdem sind in LOST noch kleinere POSIX-Ergänzungen
nötig, damit ich einen Lauftest machen kann. Das ist natürlich generell kein
gutes Zeichen, CDI-Treiber sollten möglichst kein POSIX voraussetzen. An den
entsprechenden Stellen würde ich daher zumindest mal ein FIXME hinschreiben.
Am Samstag, 20. September 2008 20:41:27 schrieb Janosch Gräf:
> Eigentlich läuft iso9660 soweit. Bei Rockridge fehlt noch ein bisschen,
> aber immerhin gehen schon lange Dateinamen.
> iso9660.patch
> diff -urNp tmp/dir.c iso9660/dir.c
> --- tmp/dir.c 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/dir.c 2008-09-20 20:39:36.000000000 +0200
> @@ -0,0 +1,165 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <sys/types.h>
> +#include <time.h>
> +#include <sys/stat.h>
Das sind allesamt POSIX-Header.
> +
> +#include "cdi/fs.h"
> +#include "cdi/lists.h"
> +#include "cdi/cache.h"
> +
> +#include "directory_record.h"
> +#include "volume_descriptor.h"
> +#include "iso9660def.h"
> +
> +#ifdef ISO9660_USE_ROCKRIDGE
> + #include "rockridge.h"
> +#endif
> +
> +#include "iso9660_cdi.h"
> +
> +#ifdef ISO9660_LOWER_FILENAMES
> + #include <ctype.h>
> +#endif
> +
> +/**
> + * Parse ISO9660 name
> + * @param ident Identifier
> + * @param len Length of Identifier
> + * @return Name (should be passed to free())
> + */
> +static char *parse_name(char *ident,size_t len) {
> + if (ident[len-2]==';') len -= 2;
> + if (ident[len-1]=='.') len--;
> + char *name = memcpy(malloc(len+1),ident,len);
stdlib.h ist nicht eingebunden, wird für malloc aber benötigt.
> +#ifdef ISO9660_LOWER_FILENAMES
> + size_t i;
> + for (i=0;i<len;i++) name[i] = tolower(name[i]);
> +#endif
> + name[len] = 0;
> + return name;
> +}
> +
> +static cdi_fs_res_class_t parse_class(mode_t mode,cdi_fs_res_type_t
> *special) { + cdi_fs_res_class_t class = CDI_FS_CLASS_FILE;
> + if (S_ISBLK(mode)) {
> + class = CDI_FS_CLASS_SPECIAL;
> + if (special!=NULL) *special = CDI_FS_BLOCK;
> + }
> + else if (S_ISCHR(mode)) {
> + class = CDI_FS_CLASS_SPECIAL;
> + if (special!=NULL) *special = CDI_FS_BLOCK;
> + }
> + else if (S_ISFIFO(mode)) {
> + class = CDI_FS_CLASS_SPECIAL;
> + if (special!=NULL) *special = CDI_FS_FIFO;
> + }
> + else if (S_ISSOCK(mode)) {
> + class = CDI_FS_CLASS_SPECIAL;
> + if (special!=NULL) *special = CDI_FS_SOCKET;
> + }
> + else if (S_ISREG(mode)) class = CDI_FS_CLASS_FILE;
> + else if (S_ISDIR(mode)) class = CDI_FS_CLASS_DIR;
> + else if (S_ISLNK(mode)) class = CDI_FS_CLASS_LINK;
> + return class;
> +}
> +
> +static time_t parse_date(struct iso9660_dirrec_date *date) {
> + struct tm tm = {
> + .tm_sec = date->second,
> + .tm_min = date->minute,
> + .tm_hour = date->hour,
> + .tm_mday = date->day,
> + .tm_mon = date->month-1,
> + .tm_year = date->second
> + };
> + return mktime(&tm);
> +}
> +
> +struct iso9660_fs_res *iso9660_dirrec_load(struct iso9660_dirrec
> *dirrec,struct iso9660_fs_res *parent,struct iso9660_voldesc_prim *voldesc)
> { + char *name = NULL;
> + time_t ctime = 0;
> + time_t atime = 0;
> + time_t mtime = 0;
> + cdi_fs_res_class_t class = 0;
> + cdi_fs_res_type_t type = 0;
> + mode_t mode;
> +
> +#ifdef ISO9660_USE_ROCKRIDGE
> + if
> (iso9660_rockridge_scan(dirrec,&name,&mode,NULL,NULL,NULL,&atime,&ctime,&mt
>ime)==0) { + class = parse_class(mode,&type);
> + }
> + else {
> + name = NULL;
> + class = 0;
> +#endif
> + ctime = parse_date(&(dirrec->date_creation));
> + atime = ctime;
> + mtime = ctime;
> +#ifdef ISO9660_USE_ROCKRIDGE
> + }
> +#endif
> + if (name==NULL) name =
> parse_name(dirrec->identifier,dirrec->identifier_length);
dir.c:120: error: pointer targets in passing argument 1 of ‘parse_name’ differ
in signedness
> + if (class==0)
> class =
> (dirrec->flags&ISO9660_DIRREC_DIR)?CDI_FS_CLASS_DIR:CDI_FS_CLASS_FILE; +
> + struct iso9660_fs_res *new =
> iso9660_fs_res_create(name,parent,class,type); + if (voldesc!=NULL)
> new->voldesc = voldesc;
> + new->ctime = ctime;
> + new->atime = atime;
> + new->mtime = mtime;
> + new->data_sector = dirrec->data_sector;
> + new->data_size = dirrec->data_size;
> +
> + free(name);
> + return new;
> +}
> +
> +cdi_list_t iso9660_dir_load(struct iso9660_fs_res *res) {
> + fprintf(stderr,"iso9660_dir_load(0x%x(%s))\n",res,res->res.name);
> + struct iso9660_dirrec *dirrec;
> + size_t i = 0;
> + cdi_list_t dirlist = cdi_list_create();
> + size_t curpos = 0;
> +
> + while (1) {
> + uint8_t size;
> +
> + iso9660_read(res,curpos,1,&size);
> + //cdi_cache_entry_read(res->cache_entry,curpos,1,&size);
> + if (size==0) break;
> +
> + dirrec = malloc(size);
> + iso9660_read(res,curpos,size,dirrec);
> + //cdi_cache_entry_read(res->cache_entry,curpos,size,dirrec);
> +
> + if (i>1) cdi_list_push(dirlist,iso9660_dirrec_load(dirrec,res,NULL));
> +
> + curpos += size;
> + i++;
> + }
> +
> + return dirlist;
> +}
> +
> +cdi_list_t iso9660_fs_dir_list(struct cdi_fs_stream *stream) {
> + struct iso9660_fs_res *res = (struct iso9660_fs_res*)stream->res;
> +
> + return res->res.children;
> +}
> diff -urNp tmp/directory_record.h iso9660/directory_record.h
> --- tmp/directory_record.h 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/directory_record.h 2008-09-20 20:39:36.000000000 +0200
> @@ -0,0 +1,93 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef _DIRECTORY_RECORD_H_
> +#define _DIRECTORY_RECORD_H_
> +
> +#include <stdint.h>
> +
> +struct iso9660_dirrec_date {
> + // Number of years since 1900
> + uint8_t year;
> +
> + // Month (1=January, 2=February)
> + uint8_t month;
> +
> + // Day of month
> + uint8_t day;
> +
> + // Hour
> + uint8_t hour;
> +
> + // Minute
> + uint8_t minute;
> +
> + // Second
> + uint8_t second;
> +
> + // GMT offset (in 15min intervals)
> + int8_t gmtoff;
> +} __attribute__ ((packed));
> +
> +#define ISO9660_DIRREC_HIDDEN 1
> +#define ISO9660_DIRREC_DIR 2
> +#define ISO9660_DIRREC_ASSOC 4
> +#define ISO9660_DIRREC_RECFMT 8
> +#define ISO9660_DIRREC_PERM 16
> +#define ISO9660_DIRREC_NOTFINAL 128
> +
> +struct iso9660_dirrec {
> + // Size of this record (must be even)
> + uint8_t record_size;
> +
> + // Number of sectors in extended attribute record
> + uint8_t num_sectors_extattrrec;
> +
> + // First sector for file/directory data (0 if empty)
> + uint32_t data_sector;
> + uint32_t data_sector_be;
> +
> + // File/directory data size
> + uint32_t data_size;
> + uint32_t data_size_be;
> +
> + // Date of creation
> + struct iso9660_dirrec_date date_creation;
> +
> + // File flags
> + uint8_t flags;
> +
> + // Unit size for interleaved files (should be 0)
> + uint8_t interleaved_unit_size;
> +
> + // Gap size for interleaved files (should be 0)
> + uint8_t interleaved_gap_size;
> +
> + // Volume sequence number
> + uint16_t volume_seq;
> + uint16_t volume_seq_be;
> +
> + // Identifier length
> + uint8_t identifier_length;
> +
> + // Identifier
> + uint8_t identifier[1];
> +} __attribute__ ((packed));
> +
> +#endif
> diff -urNp tmp/file.c iso9660/file.c
> --- tmp/file.c 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/file.c 2008-09-20 20:39:09.000000000 +0200
> @@ -0,0 +1,43 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include "cdi/fs.h"
> +#include "cdi/cache.h"
> +
> +#include "iso9660_cdi.h"
> +
> +/**
> + * Reads from file
> + * @param stream CDI FS stream
> + * @param start Offset in flie
> + * @param size How many bytes to read
> + * @param buffer Buffer to store data in
> + * @return How many bytes read
> + */
> +size_t iso9660_fs_file_read(struct cdi_fs_stream *stream,uint64_t
> start,size_t size,void *buffer) { +
> fprintf(stderr,"iso9660_fs_file_read(0x%x,0x%x,0x%x,0x%x,0x%x)\n",stream,s
>tart,size,buffer); + struct iso9660_fs_res *res = (struct
> iso9660_fs_res*)stream->res; +
> + if (start>res->data_size) return 0;
> + if (start+size>res->data_size) size = res->data_size-start;
> +
> + iso9660_read(res,start,size,buffer);
> + //cdi_cache_entry_read(res->cache_entry,start,size,buffer);
> + return size;
> +}
> diff -urNp tmp/init.c iso9660/init.c
> --- tmp/init.c 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/init.c 2008-09-20 20:39:11.000000000 +0200
> @@ -0,0 +1,58 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <sys/types.h>
> +#include <stddef.h>
stdlib.h fehlt wieder
> +
> +#include "cdi/fs.h"
> +#include "cdi/cache.h"
> +
> +#include "iso9660_cdi.h"
> +
> +#include "volume_descriptor.h"
> +
> +/**
> + * Initializes a ISO9660 filesystem
> + * @param fs Filesystem to initialize
> + * @return If initialization was successful
> + */
> +int iso9660_fs_init(struct cdi_fs_filesystem *fs) {
> + fprintf(stderr,"iso9660_fs_init(0x%x)\n",fs);
> + struct iso9660_voldesc_prim *voldesc = malloc(sizeof(struct
> iso9660_voldesc_prim)); + if
> (iso9660_voldesc_load(fs,ISO9660_VOLDESC_PRIM,voldesc)!=-1) { + struct
> iso9660_fs_res *root_res =
> iso9660_dirrec_load(&voldesc->root_dir,NULL,voldesc); + root_res->cache
> =
> cdi_cache_create(voldesc->sector_size,0,iso9660_sector_read_cache,NULL,fs);
init.c:41: error: passing argument 3 of ‘cdi_cache_create’ from incompatible
pointer type
Scheint der Rückgabewert zu sein, size_t statt int
> + fs->root_res = (struct cdi_fs_res*)root_res;
> + return 1;
> + }
> + else return 0;
> +}
> +
> +/**
> + * Destroys a FS
> + * @param fs Filesystem to destroy
> + * @return If destroy was successful
> + */
> +int iso9660_fs_destroy(struct cdi_fs_filesystem *fs) {
> + fprintf(stderr,"iso9660_fs_destroy(0x%x)\n",fs);
> + struct iso9660_fs_res *root_res = (struct
> iso9660_fs_res*)(fs->root_res); + free(root_res->voldesc);
> + cdi_cache_destroy(root_res->cache);
> + return iso9660_fs_res_destroy(root_res);
> +}
> diff -urNp tmp/iso9660_cdi.h iso9660/iso9660_cdi.h
> --- tmp/iso9660_cdi.h 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/iso9660_cdi.h 2008-09-20 20:39:13.000000000 +0200
> @@ -0,0 +1,94 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef _ISO9660_CDI_H_
> +#define _ISO9660_CDI_H_
> +
> +#include <sys/types.h>
> +#include <stdint.h>
> +
> +#include "cdi/fs.h"
> +#include "cdi/cache.h"
> +#include "cdi/lists.h"
> +
> +#include "iso9660def.h"
> +#include "volume_descriptor.h"
> +
> +#include <stdio.h>
> +
> +// ISO9660 Resource
> +struct iso9660_fs_res {
> + struct cdi_fs_res res;
> +
> + // Creation time
> + time_t ctime;
> +
> + // Access time
> + time_t atime;
> +
> + // Modification time
> + time_t mtime;
> +
> + // First sector with the resource data
> + uint64_t data_sector;
> +
> + // Size of resource data
> + uint32_t data_size;
> +
> + // File class
> + cdi_fs_res_class_t class;
> +
> + // Primary volume descriptor
> + struct iso9660_voldesc_prim *voldesc;
> +
> + // Cache
> + struct cdi_cache *cache;
> +};
> +
> +// init.c
> +int iso9660_fs_init(struct cdi_fs_filesystem *fs);
> +int iso9660_fs_destroy(struct cdi_fs_filesystem *fs);
> +
> +// res.c
> +struct iso9660_fs_res *iso9660_fs_res_create(const char *name,struct
> iso9660_fs_res *parent,cdi_fs_res_class_t class,cdi_fs_res_type_t type);
> +int iso9660_fs_res_destroy(struct iso9660_fs_res *res);
> +int iso9660_fs_res_load(struct cdi_fs_stream *stream);
> +int iso9660_fs_res_unload(struct cdi_fs_stream *stream);
> +int64_t iso9660_fs_res_meta_read(struct cdi_fs_stream
> *stream,cdi_fs_meta_t meta); +
> +// file.c
> +size_t iso9660_fs_file_read(struct cdi_fs_stream *stream,uint64_t
> start,size_t size,void *buffer); +
> +// dir.c
> +cdi_list_t iso9660_dir_load(struct iso9660_fs_res *res);
> +struct iso9660_fs_res *iso9660_dirrec_load(struct iso9660_dirrec
> *dirrec,struct iso9660_fs_res *parent,struct iso9660_voldesc_prim
> *voldesc); +cdi_list_t iso9660_fs_dir_list(struct cdi_fs_stream *stream);
> +
> +// Sector
> +#define iso9660_sector_read(fs,start,size,buffer)
> cdi_fs_data_read(fs,start,size,buffer) +size_t iso9660_read(struct
> iso9660_fs_res *res,size_t pos,size_t size,void *buffer); +size_t
> iso9660_sector_read_cache(struct cdi_cache *cache,uint64_t block,size_t
> count,void *dest,void *prv); +
> +// Resources
> +extern struct cdi_fs_res_res iso9660_fs_res_res;
> +extern struct cdi_fs_res_file iso9660_fs_res_file;
> +extern struct cdi_fs_res_dir iso9660_fs_res_dir;
> +
> +
> +#endif
> diff -urNp tmp/iso9660def.h iso9660/iso9660def.h
> --- tmp/iso9660def.h 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/iso9660def.h 2008-09-20 20:39:13.000000000 +0200
> @@ -0,0 +1,38 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef _ISO9660DEF_H_
> +#define _ISO9660DEF_H_
> +
> +// Default sector size. Used to load volume descriptors
> +#define ISO9660_DEFAULT_SECTOR_SIZE 2048
> +
> +// Number of first used sector (first volume descriptor)
> +#define ISO9660_FIRST_SECTOR 16
> +
> +// Define if you want to use lower filenames
> +// (if you don't use an extension that supports lower filenames)
> +#define ISO9660_LOWER_FILENAMES
> +
> +#ifndef ISO9660_USE_ROCKRIDGE
> + // Define if you want to use Rockridge extension
> + #define ISO9660_USE_ROCKRIDGE
> +#endif
> +
> +#endif
> diff -urNp tmp/main.c iso9660/main.c
> --- tmp/main.c 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/main.c 2008-09-20 20:39:16.000000000 +0200
> @@ -0,0 +1,73 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include "cdi/fs.h"
> +
> +#include "iso9660_cdi.h"
> +
> +struct iso9660_driver {
> + struct cdi_fs_driver drv;
> +};
> +
> +static struct iso9660_driver iso9660_driver;
> +static const char* driver_name = "iso9660";
> +
> +static int iso9660_driver_init(struct iso9660_driver *driver);
> +static void iso9660_driver_destroy(struct iso9660_driver *driver);
> +
> +#ifdef CDI_STANDALONE
> +int main()
> +#else
> +int init_iso9660()
> +#endif
> +{
> + cdi_init();
> +
> + if (iso9660_driver_init(&iso9660_driver)!=0) return -1;
> + cdi_fs_driver_register((struct cdi_fs_driver*)&iso9660_driver);
> +
> +#ifdef CDI_STANDALONE
> + cdi_run_drivers();
> +#endif
> +
> + return 0;
> +}
> +
> +/**
> + * Initialisiert die Datenstrukturen fuer den iso9660-Treiber
> + */
> +static int iso9660_driver_init(struct iso9660_driver *driver) {
> + // Konstruktor der Vaterklasse
> + cdi_fs_driver_init((struct cdi_fs_driver*)driver);
> +
> + // Namen setzen
> + driver->drv.drv.name = driver_name;
> + driver->drv.fs_init = iso9660_fs_init;
> + driver->drv.fs_destroy = iso9660_fs_destroy;
> + driver->drv.drv.destroy = iso9660_driver_destroy;
> + return 0;
> +}
> +
> +/**
> + * Deinitialisiert die Datenstrukturen fuer den iso9660-Treiber
> + */
> +static void iso9660_driver_destroy(struct iso9660_driver* driver)
Das sollte einen struct cdi_driver* als Parameter bekommen.
> +{
> + cdi_fs_driver_destroy((struct cdi_fs_driver*)driver);
> +}
> diff -urNp tmp/Makefile iso9660/Makefile
> --- tmp/Makefile 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/Makefile 2008-09-20 20:14:09.000000000 +0200
> @@ -0,0 +1,13 @@
> +-include ../../Makefile.config
> +
> +all:
> + $(CC) -o iso9660 *.c -lcdi
> + $(STRIP) iso9660
> + cp iso9660 ../../files/bin
> +
> +debug:
> + $(CC) -o iso9660 *.c -lcdi
> + $(OBJDUMP) -d -S iso9660 > iso9660.objdump
> +
> +clean:
> + rm iso9660
> diff -urNp tmp/res.c iso9660/res.c
> --- tmp/res.c 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/res.c 2008-09-20 20:39:26.000000000 +0200
> @@ -0,0 +1,150 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <sys/types.h>
> +#include <string.h>
> +#include <stdlib.h>
> +#include <time.h>
> +
> +#include "cdi/lists.h"
> +#include "cdi/fs.h"
> +#include "cdi/cache.h"
> +
> +#include "volume_descriptor.h"
> +
> +#include "iso9660_cdi.h"
> +
> +/**
> + * Creates a new resource
> + * @param name Name of resource
> + * @param parent Parent resource
> + * @param class File class
> + * @param type Special file type
> + * @return ISO9660 class
> + */
> +struct iso9660_fs_res *iso9660_fs_res_create(const char *name,struct
> iso9660_fs_res *parent,cdi_fs_res_class_t class,cdi_fs_res_type_t type) { +
> fprintf(stderr,"iso9660_fs_res_create(%s,0x%x,%d)\n",name,parent,class); +
> struct iso9660_fs_res *res = malloc(sizeof(struct iso9660_fs_res)); +
> + memset(res,0,sizeof(struct iso9660_fs_res));
> + res->res.name = strdup(name);
> + res->res.res = &iso9660_fs_res_res;
> + res->res.parent = (struct cdi_fs_res*)parent;
> + res->class = class;
> + res->res.type = type;
> + if (class==CDI_FS_CLASS_DIR) res->res.dir = &iso9660_fs_res_dir;
> + else res->res.file = &iso9660_fs_res_file;
> + res->res.flags.read = 1;
> + res->res.flags.execute = 1;
> + res->res.flags.browse = 1;
> + res->res.flags.read_link = 1;
> +
> + if (parent!=NULL) {
> + res->voldesc = parent->voldesc;
> + res->cache = parent->cache;
> + }
> + return res;
> +}
> +
> +/**
> + * Destroys a resource
> + * @param res ISO9660 resource
> + * @return 0=success; -1=failure
> + */
> +int iso9660_fs_res_destroy(struct iso9660_fs_res *res) {
> + fprintf(stderr,"iso9660_fs_res_destroy(0x%x)\n",res);
> + free(res->res.name);
> + if (res->res.children!=NULL) {
> + size_t i;
> + struct iso9660_fs_res *child;
> + for (i=0;(child = cdi_list_get(res->res.children,i));i++)
> iso9660_fs_res_destroy(child); + cdi_list_destroy(res->res.children);
> + }
> + return 0;
> +}
> +
> +/**
> + * Loads a resource
> + * @param stream CDI FS stream
> + * @return 0=success; -1=failure
> + */
> +int iso9660_fs_res_load(struct cdi_fs_stream *stream) {
> + struct iso9660_fs_res *res = (struct iso9660_fs_res*)stream->res;
> +
> + if (!res->res.loaded) {
> + // Create cache
> + //size_t i;
> + //for (i=0;i<res->data_size;i+=res->voldesc->sector_size)
> cdi_cache_entry_new(res->cache,res->data_offset+i,res->voldesc->sector_size
>); +
> + if (res->class==CDI_FS_CLASS_DIR) res->res.children =
> iso9660_dir_load(res); + else res->res.children = cdi_list_create();
> + res->res.loaded = 1;
> + }
> + return 1;
> +}
> +
> +/**
> + * Unloads a resource
> + * @param stream CDI FS stream
> + * @return 0=success; -1=failure
> + */
> +int iso9660_fs_res_unload(struct cdi_fs_stream *stream) {
> + struct iso9660_fs_res *res = (struct iso9660_fs_res*)stream->res;
> +
> + if (res->res.loaded) {
> + // Destroy children
> + struct iso9660_fs_res *child;
> + while (child = cdi_list_pop(res->res.children))
Ein zusätzliches Klammerpaar gegen Compilerwarnungen.
> iso9660_fs_res_destroy(child); + cdi_list_destroy(res->res.children);
> +
> + res->res.loaded = 0;
> + }
> + return 1;
> +}
> +
> +/**
> + * Reads meta data from resource
> + * @param stream CDI FS stream
> + * @param meta Type of meta data
> + * @return Meta data
> + */
> +int64_t iso9660_fs_res_meta_read(struct cdi_fs_stream
> *stream,cdi_fs_meta_t meta) { + struct iso9660_fs_res *res = (struct
> iso9660_fs_res*)stream->res; + switch (meta) {
> + case CDI_FS_META_SIZE:
> + return res->data_size;
> +
> + case CDI_FS_META_USEDBLOCKS:
> + return (res->data_size-1)/res->voldesc->sector_size+1;
> +
> + case CDI_FS_META_BESTBLOCKSZ:
> + case CDI_FS_META_BLOCKSZ:
> + return res->voldesc->sector_size;
> +
> + case CDI_FS_META_CREATETIME:
> + return res->ctime;
> +
> + case CDI_FS_META_ACCESSTIME:
> + return res->atime;
> +
> + case CDI_FS_META_CHANGETIME:
> + return res->mtime;
> + }
> + return 0;
> +}
> diff -urNp tmp/resources.c iso9660/resources.c
> --- tmp/resources.c 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/resources.c 2008-09-20 20:39:27.000000000 +0200
> @@ -0,0 +1,38 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include "iso9660_cdi.h"
> +
> +struct cdi_fs_res_res iso9660_fs_res_res = {
> + .load = iso9660_fs_res_load,
> + .unload = iso9660_fs_res_unload,
> + .meta_read = iso9660_fs_res_meta_read,
> +};
> +
> +struct cdi_fs_res_file iso9660_fs_res_file = {
> + // Prinzipiell haben wir nur ausfuehrbare Dateien, der Rest wird mit
> den + // Berechtigungen geregelt
> + .executable = 1,
> +
> + .read = iso9660_fs_file_read,
> +};
> +
> +struct cdi_fs_res_dir iso9660_fs_res_dir = {
> + .list = iso9660_fs_dir_list,
> +};
> diff -urNp tmp/rockridge.c iso9660/rockridge.c
> --- tmp/rockridge.c 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/rockridge.c 2008-09-20 20:40:59.000000000 +0200
> @@ -0,0 +1,89 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include "iso9660def.h"
> +#ifdef ISO9660_USE_ROCKRIDGE
> +
> +#include <stdint.h>
> +#include <stddef.h>
> +#include <string.h>
> +#include <stdlib.h>
> +#include <ctype.h>
> +
> +#include "cdi/lists.h"
> +
> +#include "rockridge.h"
> +#include "directory_record.h"
> +
> +/**
> + * Scans system use area in directory record for rockridge entries
> + * @param dirrec Directory record
> + * @param _name Reference for POSIX name
> + * @param mode Reference for file mode
> + * @param uid Reference for UID
> + * @param gid Reference for GID
> + * @param nlink Reference for number of hardlinks
> + * @param atime Reference for access time
> + * @param ctime Reference for createtion time
> + * @param mtime Reference for modification time
> + * @return 0=success; -1=failure
> + */
> +int iso9660_rockridge_scan(struct iso9660_dirrec *dirrec,char
> **_name,mode_t *mode,uid_t *uid,gid_t *gid,nlink_t *nlink,time_t
> *atime,time_t *ctime,time_t *mtime) { + struct iso9660_rockridge *sue =
> ((void*)(dirrec->identifier))+dirrec->identifier_length; + if
> ((((uintptr_t)sue)&1)==1) sue = ((void*)sue)+1;
> +
> + if (sue->sig!=ISO9660_ROCKRIDGE_SIG_RR) return -1;
> +
> + char *name = NULL;
> + size_t name_size = 0;
> +
> + while (sue->sig!=ISO9660_ROCKRIDGE_SIG_ST && sue->sig!=0 &&
> ((uintptr_t)sue-(uintptr_t)dirrec)+4<dirrec->record_size) { + if
> (sue->sig==ISO9660_ROCKRIDGE_SIG_PX) {
> + struct iso9660_rockridge_px *sue_px = (struct
> iso9660_rockridge_px*)sue; + if (mode!=NULL) *mode = sue_px->mode;
> + if (nlink!=NULL) *nlink = sue_px->nlink;
> + if (uid!=NULL) *uid = sue_px->uid;
> + if (gid!=NULL) *gid = sue_px->gid;
> + }
> + else if (sue->sig==ISO9660_ROCKRIDGE_SIG_NM) {
> + struct iso9660_rockridge_nm *sue_nm = (struct
> iso9660_rockridge_nm*)sue; + if
> (sue_nm->flags&ISO9660_ROCKRIDGE_NAMEFLAG_CURRENT) *_name = strdup("."); +
> else if (sue_nm->flags&ISO9660_ROCKRIDGE_NAMEFLAG_PARENT) *_name =
> strdup(".."); + else {
> + size_t part_size = sue->size-offsetof(struct
> iso9660_rockridge_nm,name); + name =
> realloc(name,name_size+part_size+1);
> + memcpy(name+name_size,sue_nm->name,part_size);
> + name_size += part_size;
> + }
> + }
> + sue = ((void*)sue)+sue->size;
> + }
> +
> + if (name!=NULL) {
> + if (_name!=NULL) {
> + name[name_size] = 0;
> + *_name = name;
> + }
> + else free(name);
> + }
> +
> + return 0;
> +}
> +
> +#endif
> diff -urNp tmp/rockridge.h iso9660/rockridge.h
> --- tmp/rockridge.h 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/rockridge.h 2008-09-20 20:39:28.000000000 +0200
> @@ -0,0 +1,160 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef _ISO9660_ROCKRIDGE_H_
> +#define _ISO9660_ROCKRIDGE_H_
> +
> +#include <sys/types.h>
> +#include <stdint.h>
> +
> +#include "directory_record.h"
> +
> +#define ISO9660_ROCKRIDGE_VERSION 1
> +
> +#define ISO9660_ROCKRIDGE_SL_FLAG_LAST 1
> +
> +#define ISO9660_ROCKRIDGE_NAMEFLAG_CONTINUE 1
> +#define ISO9660_ROCKRIDGE_NAMEFLAG_CURRENT 2
> +#define ISO9660_ROCKRIDGE_NAMEFLAG_PARENT 4
> +#define ISO9660_ROCKRIDGE_NAMEFLAG_ROOT 8
> +
> +#define ISO9660_ROCKRIDGE_TFFLAG_CREATION 1
> +#define ISO9660_ROCKRIDGE_TFFLAG_MODIFY 2
> +#define ISO9660_ROCKRIDGE_TFFLAG_ACCESS 4
> +#define ISO9660_ROCKRIDGE_TFFLAG_ATTRIBUTES 8
> +#define ISO9660_ROCKRIDGE_TFFLAG_BACKUP 16
> +#define ISO9660_ROCKRIDGE_TFFLAG_EXPIRATION 32
> +#define ISO9660_ROCKRIDGE_TFFLAG_EFFECTIVE 64
> +#define ISO9660_ROCKRIDGE_TFFLAG_LONGFORM 128
> +
> +#define ISO9660_ROCKRIDGE_SIG_SP ('S'|('P'<<8))
> +#define ISO9660_ROCKRIDGE_SIG_ST ('S'|('T'<<8))
> +#define ISO9660_ROCKRIDGE_SIG_RR ('R'|('R'<<8)) ///< @todo Actually the
> SUE must start with SP and not with RR +#define ISO9660_ROCKRIDGE_SIG_PX
> ('P'|('X'<<8))
> +#define ISO9660_ROCKRIDGE_SIG_PN ('P'|('N'<<8))
> +#define ISO9660_ROCKRIDGE_SIG_SL ('S'|('L'<<8))
> +#define ISO9660_ROCKRIDGE_SIG_NM ('N'|('M'<<8))
> +#define ISO9660_ROCKRIDGE_SIG_CL ('C'|('L'<<8))
> +#define ISO9660_ROCKRIDGE_SIG_PL ('P'|('L'<<8))
> +#define ISO9660_ROCKRIDGE_SIG_RE ('R'|('E'<<8))
> +#define ISO9660_ROCKRIDGE_SIG_RF ('R'|('F'<<8))
> +#define ISO9660_ROCKRIDGE_SIG_SF ('S'|('F'<<8))
> +
> +// Rockridge System Use Entry
> +struct iso9660_rockridge {
> + // Field signature
> + uint16_t sig;
> +
> + // Size of field
> + uint8_t size;
> +
> + // Version
> + uint8_t version;
> +} __attribute__ ((packed));
> +
> +///< @todo Actually the SUE must start with SP and not with RR
> +struct iso9660_rockridge_rr {
> + // Size: 5
> + struct iso9660_rockridge header;
> + uint8_t unknown;
> +} __attribute__ ((packed));
> +
> +// Rockridge System Use Entry for file permissions
> +struct iso9660_rockridge_px {
> + // Size: 44
> + struct iso9660_rockridge header;
> +
> + // File mode (like in sys/stat.h)
> + uint32_t mode;
> + uint32_t mode_be;
> +
> + // Number of links (like in sys/stat.h)
> + uint32_t nlink;
> + uint32_t nlink_be;
> +
> + // Owner UID
> + uint32_t uid;
> + uint32_t uid_be;
> +
> + // Owner GID
> + uint32_t gid;
> + uint32_t gid_be;
> +
> + // File serial number
> + uint32_t serial;
> + uint32_t serial_be;
> +} __attribute__ ((packed));
> +
> +// Rockridge System Use Entry for device nodes
> +struct iso9660_rockridge_pn {
> + // Size: 20
> + struct iso9660_rockridge header;
> +
> + // Device number
> + uint32_t devhi;
> + uint32_t devhi_be;
> + uint32_t devlo;
> + uint32_t devlo_be;
> +} __attribute__ ((packed));
> +
> +// Rockridge SL Component
> +struct iso9660_rockridge_sl_component {
> + uint8_t flags;
> + uint8_t len;
> + uint8_t content[0];
> +} __attribute__ ((packed));
> +
> +// Rockridge System Use Entry for symbolic links
> +struct iso9660_rockridge_sl {
> + // Size:
> + struct iso9660_rockridge header;
> +
> + // Flags
> + uint8_t flags;
> +
> + // Component Area
> + struct iso9660_rockridge_sl_component component_area[0];
> +} __attribute__ ((packed));
> +
> +// Rockridge System Use Entry for POSIX names
> +struct iso9660_rockridge_nm {
> + // Size:
> + struct iso9660_rockridge header;
> +
> + // Flags
> + uint8_t flags;
> +
> + // Name content
> + uint8_t name[1];
> +} __attribute__ ((packed));
> +
> +// Rockridge System Use Entry for timestamps
> +struct iso9660_rockridge_tf {
> + // Size:
> + struct iso9660_rockridge header;
> +
> + // Flags (Type of timestamp
> + uint8_t flags;
> +
> + /// @todo
> +} __attribute__ ((packed));
> +
> +int iso9660_rockridge_scan(struct iso9660_dirrec *dirrec,char
> **_name,mode_t *mode,uid_t *uid,gid_t *gid,nlink_t *nlink,time_t
> *atime,time_t *ctime,time_t *mtime); +
> +#endif
> diff -urNp tmp/sector.c iso9660/sector.c
> --- tmp/sector.c 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/sector.c 2008-09-20 20:39:29.000000000 +0200
> @@ -0,0 +1,85 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <stdint.h>
> +
> +#include "cdi/fs.h"
> +#include "cdi/cache.h"
> +
> +#include "iso9660def.h"
> +
> +#include "iso9660_cdi.h"
> +
> +/**
> + * Reads data from device for cache
> + * @param cache CDI cache
> + * @param block Block to read
> + * @param count How many blocks to read
> + * @param dest Buffer to store data in
> + * @param prv Private data (CDI filesystem)
> + * @return 0=success; -1=failure
> + */
> +size_t iso9660_sector_read_cache(struct cdi_cache *cache,uint64_t
> block,size_t count,void *dest,void *prv) { +
> fprintf(stderr,"iso9660_sector_read_cache(0x%x,0x%x,0x%x,0x%x,0x%x,0x%x)\n
>",cache,block,count,dest,prv); + uint64_t start =
> ((uint64_t)block)*ISO9660_DEFAULT_SECTOR_SIZE; + size_t size =
> count*ISO9660_DEFAULT_SECTOR_SIZE;
> + return
> iso9660_sector_read(prv,start,size,dest)/ISO9660_DEFAULT_SECTOR_SIZE; +}
> +
> +/**
> + * Read data from resource
> + * @param res Resource to read data from
> + * @param pos Position in resource
> + * @param size How many bytes to read
> + * @param Buffer Buffer to store data in
> + * @return How many bytes read
> + */
> +size_t iso9660_read(struct iso9660_fs_res *res,size_t pos,size_t size,void
> *buffer) { + size_t block = pos/res->voldesc->sector_size;
> + size_t offset = pos%res->voldesc->sector_size;
> + size_t rem_size = size;
> +
> + while (rem_size>0) {
> + //fprintf(stderr,"Block: 0x%x\n",res->data_sector+block++);
> + struct cdi_cache_block *cache_block =
> cdi_cache_block_get(res->cache,res->data_sector+block++); + size_t
> cur_size =
> rem_size>res->voldesc->sector_size?res->voldesc->sector_size:rem_size; +
> memcpy(buffer,cache_block->data+offset,cur_size);
> + cdi_cache_block_release(res->cache,cache_block);
> + buffer += cur_size;
> + rem_size -= cur_size;
> + offset = 0;
> + }
> +
> + return size;
> +}
> +
> +/*
> +int iso9660_sector_read_cache(struct cdi_cache *cache,uint64_t
> block,size_t count,void *dest,void *prv) { + struct cdi_fs_filesystem *fs
> = prv;
> + struct iso9660_fs_res *res = (struct iso9660_fs_res*)fs->root_res;
> + uint64_t start = ((uint64_t)block)*ISO9660_DEFAULT_SECTOR_SIZE;
> + size_t size = count*ISO9660_DEFAULT_SECTOR_SIZE;
> + uint64_t maxsize =
> ((uint64_t)res->voldesc->num_sectors)*res->voldesc->sector_size; +
> + if (start>maxsize) return 0;
> + if (start+size>maxsize) size = maxsize-start;
> +
> + return iso9660_sector_read(prv,start,size,dest)==size?0:-1;
> +}
> +*/
> diff -urNp tmp/volume_descriptor.c iso9660/volume_descriptor.c
> --- tmp/volume_descriptor.c 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/volume_descriptor.c 2008-09-20 20:39:30.000000000 +0200
> @@ -0,0 +1,69 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <stdint.h>
> +
> +#include "cdi/fs.h"
> +
> +#include "iso9660_cdi.h"
> +
> +#include "iso9660def.h"
> +#include "volume_descriptor.h"
> +
> +/**
> + * Checks signature of volume descriptor
> + * @param sig Signature
> + * @return If signature is right
> + */
> +static int iso9660_voldesc_checksig(uint8_t sig[6]) {
> + size_t i;
> + char right[6] = {'C','D','0','0','1',1};
> + for (i=0;i<6;i++) {
> + if (sig[i]!=right[i]) return 0;
> + }
> + return 1;
> +}
> +
> +/**
> + * Loads a volume descriptor
> + * @param fs Filesystem
> + * @param type Type of volume descriptor
> + * @param buf Buffer for volume descriptor
> + * @return 0=success; -1=failure
> + */
> +int iso9660_voldesc_load(struct cdi_fs_filesystem
> *fs,iso9660_voldesc_type_t type,void *buf) { +
> fprintf(stderr,"iso9660_voldesc_load(0x%x,%d,0x%x)\n",fs,type,buf); +
> struct iso9660_voldesc header;
> + size_t i;
> +
> + for (i=ISO9660_FIRST_SECTOR;header.type!=type &&
> header.type!=ISO9660_VOLDESC_TERM;i++) { +
> iso9660_sector_read(fs,i*ISO9660_DEFAULT_SECTOR_SIZE,sizeof(header),&heade
>r); + if (!iso9660_voldesc_checksig(header.signature)) return -1;
> + }
> + i--;
> +
> + if (header.type==type) {
> + iso9660_sector_read(fs,i*ISO9660_DEFAULT_SECTOR_SIZE,sizeof(struct
> iso9660_voldesc_prim),buf); + return 0;
> + }
> + else {
> + fprintf(stderr,"Volume Descriptor: Wrong type: %d\n",header.type);
> + return -1;
> + }
> +}
> diff -urNp tmp/volume_descriptor.h iso9660/volume_descriptor.h
> --- tmp/volume_descriptor.h 1970-01-01 01:00:00.000000000 +0100
> +++ iso9660/volume_descriptor.h 2008-09-20 20:38:23.000000000 +0200
> @@ -0,0 +1,160 @@
> +/*
> + * iso9660 - An iso9660 CDI driver with Rockridge support
> + *
> + * Copyright (C) 2008 Janosch Gräf
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> Free + * Software Foundation; either version 3 of the License, or (at your
> option) + * any later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> WITHOUT + * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> General Public License for + * more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> with + * this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef _VOLUME_DESCRIPTOR_H_
> +#define _VOLUME_DESCRIPTOR_H_
> +
> +#include <stdint.h>
> +
> +#include "directory_record.h"
> +
> +typedef enum {
> + ISO9660_VOLDESC_TERM = 255,
> + ISO9660_VOLDESC_PRIM = 1
> +} iso9660_voldesc_type_t;
> +
> +struct iso9660_voldesc {
> + iso9660_voldesc_type_t type:8;
> + uint8_t signature[6];
> +} __attribute__ ((packed));
> +
> +struct i9660_voldesc_date {
> + // Year (as ASCII)
> + uint32_t year[4];
> +
> + // Month (as ASCII; 01=January, 02=February...)
> + uint8_t month[2];
> +
> + // Day of month (as ASCII)
> + uint8_t day[2];
> +
> + // Hour (as ASCII)
> + uint8_t hour[2];
> +
> + // Minute (as ASCII)
> + uint8_t minute[2];
> +
> + // Second (as ASCII)
> + uint8_t second[2];
> +
> + // Centisecond (as ASCII; hundredths of a second)
> + uint8_t centisecond[2];
> +
> + // Offset to GMT (in 15min intervals)
> + int8_t gmtoff;
> +} __attribute__ ((packed));
> +
> +struct iso9660_voldesc_prim {
> + // Volume Descriptor Header
> + struct iso9660_voldesc header;
> +
> + // Zeros (0)
> + uint8_t zero1;
> +
> + // System Identifier
> + uint8_t system_identifier[32];
> +
> + // Volume Identifier
> + uint8_t volume_identifier[32];
> +
> + // Zeros (0)
> + uint8_t zero2[8];
> +
> + // Total number of sectors
> + uint32_t num_sectors;
> + uint32_t num_sectors_be;
> +
> + // Zeros (0)
> + uint8_t zero3[32];
> +
> + // Set size (1)
> + uint16_t set_size;
> + uint16_t set_size_be;
> +
> + // Sequence number (1)
> + uint16_t seq_num;
> + uint16_t seq_num_be;
> +
> + // Sector size (must be 2048)
> + uint16_t sector_size;
> + uint16_t sector_size_be;
> +
> + // Size of path table
> + uint32_t pathtable_size;
> + uint32_t pathtable_size_be;
> +
> + // First sectors of each path table
> + uint32_t pathtable1_sector;
> + uint32_t pathtable2_sector;
> + uint32_t pathtable1_sector_be;
> + uint32_t pathtable2_sector_be;
> +
> + // Root directory record
> + struct iso9660_dirrec root_dir;
> +
> + // Volume Set Identifier
> + uint8_t volume_set_identifier[128];
> +
> + // Publisher Identifier
> + uint8_t publisher_identifier[128];
> +
> + // Data Preparer Identifier
> + uint8_t datapreparer_identifier[128];
> +
> + // Application Identifier
> + uint8_t application_identifier[128];
> +
> + // Copyright File Identifier
> + uint8_t copyright_file_identifier[37];
> +
> + // Abstract File Identifier
> + uint8_t abstract_file_identifier[37];
> +
> + // Bibliographical File Identifier
> + uint8_t bibliographical_file_identifier[37];
> +
> + // Date of volume creation
> + struct i9660_voldesc_date date_creation;
> +
> + // Date of most recent modification
> + struct i9660_voldesc_date date_modification;
> +
> + // Date when volume expires
> + struct i9660_voldesc_date date_expire;
> +
> + // Date when volume is effective
> + struct i9660_voldesc_date date_effective;
> +#if 0
> + // Ones (1)
> + uint8_t one1;
> +
> + // Zeros (0)
> + uint8_t zero4;
> +
> + // Reserved (usally 0)
> + uint8_t reserved[512];
> +
> + // Zeros (0)
> + uint8_t zero5[653];
> +#endif
> +} __attribute__ ((packed));
> +
> +int iso9660_voldesc_load(struct cdi_fs_filesystem
> *fs,iso9660_voldesc_type_t type,void *buf); +
> +#endif
> _______________________________________________
> Lost mailing list
> Lost@xxxxxxxxxx
> http://list.tyndur.org/mailman/listinfo/lost