diff options
author | joerg <joerg@FreeBSD.org> | 1995-10-22 14:04:37 +0000 |
---|---|---|
committer | joerg <joerg@FreeBSD.org> | 1995-10-22 14:04:37 +0000 |
commit | 1d53384641b8ce578b1a1b19960a9656e46526dc (patch) | |
tree | bcf7036fe42c6460094c5b6d1532e62010855635 /gnu | |
parent | 4859036a7b7d95d1469f37948c869f363e013c70 (diff) | |
download | FreeBSD-src-1d53384641b8ce578b1a1b19960a9656e46526dc.zip FreeBSD-src-1d53384641b8ce578b1a1b19960a9656e46526dc.tar.gz |
Merge version 1.04 into HEAD.
Diffstat (limited to 'gnu')
-rw-r--r-- | gnu/usr.bin/mkisofs/Makefile.in | 4 | ||||
-rw-r--r-- | gnu/usr.bin/mkisofs/defaults.h | 16 | ||||
-rw-r--r-- | gnu/usr.bin/mkisofs/diag/Makefile | 16 | ||||
-rw-r--r-- | gnu/usr.bin/mkisofs/diag/isodump.c | 16 | ||||
-rw-r--r-- | gnu/usr.bin/mkisofs/diag/isovfy.c | 13 | ||||
-rw-r--r-- | gnu/usr.bin/mkisofs/exclude.c | 3 | ||||
-rw-r--r-- | gnu/usr.bin/mkisofs/mkisofs.c | 189 | ||||
-rw-r--r-- | gnu/usr.bin/mkisofs/mkisofs.h | 20 | ||||
-rw-r--r-- | gnu/usr.bin/mkisofs/rock.c | 2 | ||||
-rw-r--r-- | gnu/usr.bin/mkisofs/tree.c | 189 | ||||
-rw-r--r-- | gnu/usr.bin/mkisofs/write.c | 17 |
11 files changed, 411 insertions, 74 deletions
diff --git a/gnu/usr.bin/mkisofs/Makefile.in b/gnu/usr.bin/mkisofs/Makefile.in index dd0d318..dceb17c 100644 --- a/gnu/usr.bin/mkisofs/Makefile.in +++ b/gnu/usr.bin/mkisofs/Makefile.in @@ -43,7 +43,9 @@ mkisofs.o: mkisofs.c iso9660.h mkisofs.h exclude.h clean: /bin/rm -f *.o core mkisofs *~ #*# + (cd diag/; make clean) + (cd cdwrite/; make clean) dist: - tar -cvf - README Configure Makefile.in make.com TODO COPYING ChangeLog *.8 *.c *.h diag | gzip > mkisofs-1.02.tar.gz + tar -cvf - README Configure Makefile.in make.com TODO COPYING ChangeLog *.8 *.c *.h diag cdwrite.old cdwrite-1.5 | gzip > mkisofs-1.04.tar.gz diff --git a/gnu/usr.bin/mkisofs/defaults.h b/gnu/usr.bin/mkisofs/defaults.h index 27b258c..03960d1 100644 --- a/gnu/usr.bin/mkisofs/defaults.h +++ b/gnu/usr.bin/mkisofs/defaults.h @@ -11,12 +11,24 @@ #define ABSTRACT_DEFAULT NULL #define VOLSET_ID_DEFAULT NULL #define VOLUME_ID_DEFAULT "CDROM" + #ifdef __FreeBSD__ #define SYSTEM_ID_DEFAULT "FreeBSD" -#else +#endif + #ifdef __QNX__ #define SYSTEM_ID_DEFAULT "QNX" -#else +#endif + +#ifdef __linux__ #define SYSTEM_ID_DEFAULT "LINUX" #endif + + +#ifdef __osf__ +#define SYSTEM_ID_DEFAULT "OSF" +#endif + +#ifndef SYSTEM_ID_DEFAULT +#define SYSTEM_ID_DEFAULT "UNKNOWNSYS" #endif diff --git a/gnu/usr.bin/mkisofs/diag/Makefile b/gnu/usr.bin/mkisofs/diag/Makefile index 1aefdf6..e6f3a12 100644 --- a/gnu/usr.bin/mkisofs/diag/Makefile +++ b/gnu/usr.bin/mkisofs/diag/Makefile @@ -1,10 +1,16 @@ -all: dump isodump isovfy +#CC = gcc +CC = cc -traditional + +all: dump isodump isovfy + +isoinfo:isoinfo.c + ${CC} -g -o isoinfo isoinfo.c dump:dump.c - gcc -o dump dump.c + ${CC} -o dump dump.c isodump:isodump.c - gcc -o isodump isodump.c + ${CC} -o isodump isodump.c isovfy:isovfy.c - gcc -o isovfy isovfy.c + ${CC} -o isovfy isovfy.c clean: - rm dump isodump isovfy + rm -f dump isodump isovfy isoinfo diff --git a/gnu/usr.bin/mkisofs/diag/isodump.c b/gnu/usr.bin/mkisofs/diag/isodump.c index 49ef4b9..442c6ed 100644 --- a/gnu/usr.bin/mkisofs/diag/isodump.c +++ b/gnu/usr.bin/mkisofs/diag/isodump.c @@ -52,7 +52,7 @@ isonum_731 (char * p) int -isonum_733 (char * p) +isonum_733 (unsigned char * p) { return (isonum_731 (p)); } @@ -104,7 +104,7 @@ struct iso_directory_record { unsigned char interleave [ISODCL (28, 28)]; /* 711 */ unsigned char volume_sequence_number [ISODCL (29, 32)]; /* 723 */ unsigned char name_len [ISODCL (33, 33)]; /* 711 */ - unsigned char name [0]; + unsigned char name [1]; }; #ifdef USE_TERMIOS @@ -285,13 +285,15 @@ int dump_rr(struct iso_directory_record * idr) { int len; - char * pnt; + unsigned char * pnt; len = idr->length[0] & 0xff; len -= sizeof(struct iso_directory_record); + len += sizeof(idr->name); len -= idr->name_len[0]; - pnt = (char *) idr; + pnt = (unsigned char *) idr; pnt += sizeof(struct iso_directory_record); + pnt -= sizeof(idr->name); pnt += idr->name_len[0]; if((idr->name_len[0] & 1) == 0){ pnt++; @@ -318,9 +320,9 @@ showblock(int flag){ if(idr->length[0] == 0) break; printf("%3d ", idr->length[0]); printf("[%2d] ", idr->volume_sequence_number[0]); - printf("%5x ", *((unsigned int *) idr->extent)); - printf("%8d ", *((unsigned int *) idr->size)); - printf ((idr->flags[0] & 2) ? "*" : " "); + printf("%5x ", isonum_733(idr->extent)); + printf("%8d ", isonum_733(idr->size)); + printf ((idr->flags[0] & 2) ? "*" : " "); if(idr->name_len[0] == 1 && idr->name[0] == 0) printf(". "); else if(idr->name_len[0] == 1 && idr->name[0] == 1) diff --git a/gnu/usr.bin/mkisofs/diag/isovfy.c b/gnu/usr.bin/mkisofs/diag/isovfy.c index 43e1389..eb52c91 100644 --- a/gnu/usr.bin/mkisofs/diag/isovfy.c +++ b/gnu/usr.bin/mkisofs/diag/isovfy.c @@ -112,7 +112,7 @@ isonum_732 (char * p) } int -isonum_733 (char * p) +isonum_733 (unsigned char * p) { return (isonum_731 (p)); } @@ -312,14 +312,14 @@ check_tree(int file_addr, int file_size, int parent_addr){ else if(idr->name_len[0] == 1 && idr->name[0] == 0) { iline += sprintf(&lbuffer[iline],". "); rflag = 0; - if(orig_file_addr !=*((unsigned int *) idr->extent)) + if(orig_file_addr !=isonum_733(idr->extent)) iline += sprintf(&lbuffer[iline],"***** Directory has null extent.", goof++); if(i1) iline += sprintf(&lbuffer[iline],"***** . not first entry.", rr_goof++); } else if(idr->name_len[0] == 1 && idr->name[0] == 1) { iline += sprintf(&lbuffer[iline],".. "); rflag = 0; - if(parent_file_addr !=*((unsigned int *) idr->extent)) + if(parent_file_addr !=isonum_733(idr->extent)) iline += sprintf(&lbuffer[iline],"***** Directory has null extent.", goof++); if(i1 != 1) iline += sprintf(&lbuffer[iline],"***** .. not second entry.", rr_goof++); @@ -332,7 +332,10 @@ check_tree(int file_addr, int file_size, int parent_addr){ }; if(size && extent == 0) iline += sprintf(&lbuffer[iline],"****Extent==0, size != 0", goof++); +#if 0 + /* This is apparently legal. */ if(size == 0 && extent) iline += sprintf(&lbuffer[iline],"****Extent!=0, size == 0", goof++); +#endif if(idr->flags[0] & 0xfd) iline += sprintf(&lbuffer[iline],"Flags=(%x) ", idr->flags[0], goof++); @@ -361,8 +364,8 @@ check_tree(int file_addr, int file_size, int parent_addr){ - if(rflag && (idr->flags[0] & 2)) check_tree((*((unsigned int *) idr->extent)) << 11, - *((unsigned int *) idr->size), + if(rflag && (idr->flags[0] & 2)) check_tree((isonum_733(idr->extent)) << 11, + isonum_733(idr->size), orig_file_addr << 11); i += buffer[i]; i1++; diff --git a/gnu/usr.bin/mkisofs/exclude.c b/gnu/usr.bin/mkisofs/exclude.c index 99c66bd..c20ea28 100644 --- a/gnu/usr.bin/mkisofs/exclude.c +++ b/gnu/usr.bin/mkisofs/exclude.c @@ -29,8 +29,7 @@ char * fn; return; } - - excl[i] = malloc(strlen(fn)+1); + excl[i] = (char *) malloc(strlen(fn)+1); if (! excl[i]) { fprintf(stderr,"Can't allocate memory for excluded filename\n"); return; diff --git a/gnu/usr.bin/mkisofs/mkisofs.c b/gnu/usr.bin/mkisofs/mkisofs.c index 4cfed78..e1948ca 100644 --- a/gnu/usr.bin/mkisofs/mkisofs.c +++ b/gnu/usr.bin/mkisofs/mkisofs.c @@ -20,6 +20,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* ADD_FILES changes made by Ross Biro biro@yggdrasil.com 2/23/95 */ + #include "mkisofs.h" #include <assert.h> @@ -54,7 +56,7 @@ struct directory * root = NULL; -static char version_string[] = "mkisofs v1.03"; +static char version_string[] = "mkisofs v1.04"; FILE * discimage; unsigned int next_extent = 0; @@ -90,6 +92,7 @@ int omit_version_number = 0; /* May violate iso9660, but noone uses vers*/ int RR_relocation_depth = 6; /* Violates iso9660, but most systems work */ int full_iso9660_filenames = 0; /* Used with Amiga. Disc will not work with DOS */ +int allow_leading_dots = 0; /* DOS cannot read names with leading dots */ struct rcopts{ char * tag; @@ -185,7 +188,7 @@ void usage(){ fprintf(stderr,"Usage:\n"); fprintf(stderr, "mkisofs [-o outfile] [-R] [-V volid] [-v] [-a] \ -[-T]\n [-l] [-d] [-V] [-D] [-p preparer] \ +[-T]\n [-l] [-d] [-V] [-D] [-L] [-p preparer] \ [-P publisher] [ -A app_id ] [-z] \ [-x path -x path ...] path\n"); exit(1); @@ -280,9 +283,15 @@ int FDECL3(iso9660_file_length,const char*, name, struct directory_entry *, sres if(current_length < 30) *result++ = (islower(*pnt) ? toupper(*pnt) : *pnt); } else { /* Dos style filenames */ if(*pnt == '.') { - if (seen_dot) {ignore++; continue;} - if(result) *result++ = '.'; - seen_dot++; + if (!chars_before_dot && !allow_leading_dots) { + /* DOS can't read files with dot first */ + chars_before_dot++; + if (result) *result++ = '_'; /* Substitute underscore */ + } else { + if (seen_dot) {ignore++; continue;} + if(result) *result++ = '.'; + seen_dot++; + } } else if (seen_dot) { if(chars_after_dot < 3) { chars_after_dot++; @@ -367,6 +376,154 @@ int FDECL3(iso9660_file_length,const char*, name, struct directory_entry *, sres return chars_before_dot + chars_after_dot + seen_dot + extra; } +#ifdef ADD_FILES + +struct file_adds *root_file_adds = NULL; + +void +FDECL2(add_one_file, char *, addpath, char *, path ) +{ + char *cp; + char *name; + struct file_adds *f; + struct file_adds *tmp; + + f = root_file_adds; + tmp = NULL; + + name = rindex (addpath, PATH_SEPARATOR); + if (name == NULL) { + name = addpath; + } else { + name++; + } + + cp = strtok (addpath, SPATH_SEPARATOR); + + while (cp != NULL && strcmp (name, cp)) { + if (f == NULL) { + root_file_adds = e_malloc (sizeof *root_file_adds); + f=root_file_adds; + f->name = NULL; + f->child = NULL; + f->next = NULL; + f->add_count = 0; + f->adds = NULL; + f->used = 0; + } + if (f->child) { + for (tmp = f->child; tmp->next != NULL; tmp =tmp->next) { + if (strcmp (tmp->name, cp) == 0) { + f = tmp; + goto next; + } + } + if (strcmp (tmp->name, cp) == 0) { + f=tmp; + goto next; + } + /* add a new node. */ + tmp->next = e_malloc (sizeof (*tmp->next)); + f=tmp->next; + f->name = strdup (cp); + f->child = NULL; + f->next = NULL; + f->add_count = 0; + f->adds = NULL; + f->used = 0; + } else { + /* no children. */ + f->child = e_malloc (sizeof (*f->child)); + f = f->child; + f->name = strdup (cp); + f->child = NULL; + f->next = NULL; + f->add_count = 0; + f->adds = NULL; + f->used = 0; + + } + next: + cp = strtok (NULL, SPATH_SEPARATOR); + } + /* Now f if non-null points to where we should add things */ + if (f == NULL) { + root_file_adds = e_malloc (sizeof *root_file_adds); + f=root_file_adds; + f->name = NULL; + f->child = NULL; + f->next = NULL; + f->add_count = 0; + f->adds = NULL; + } + + /* Now f really points to where we should add this name. */ + f->add_count++; + f->adds = realloc (f->adds, sizeof (*f->adds)*f->add_count); + f->adds[f->add_count-1].path = strdup (path); + f->adds[f->add_count-1].name = strdup (name); +} + +void +FDECL3(add_file_list, int, argc, char **,argv, int, ind) +{ + char *ptr; + char *dup_arg; + + while (ind < argc) { + dup_arg = strdup (argv[ind]); + ptr = index (dup_arg,'='); + if (ptr == NULL) { + free (dup_arg); + return; + } + *ptr = 0; + ptr++; + add_one_file (dup_arg, ptr); + free (dup_arg); + ind++; + } +} +void +FDECL1(add_file, char *, filename) +{ + char buff[1024]; + FILE *f; + char *ptr; + char *p2; + int count=0; + + if (strcmp (filename, "-") == 0) { + f = stdin; + } else { + f = fopen (filename, "r"); + if (f == NULL) { + perror ("fopen"); + exit (1); + } + } + while (fgets (buff, 1024, f)) { + count++; + ptr = buff; + while (isspace (*ptr)) ptr++; + if (*ptr==0) continue; + if (*ptr=='#') continue; + + if (ptr[strlen(ptr)-1]== '\n') ptr[strlen(ptr)-1]=0; + p2 = index (ptr, '='); + if (p2 == NULL) { + fprintf (stderr, "Error in line %d: %s\n", count, buff); + exit (1); + } + *p2 = 0; + p2++; + add_one_file (ptr, p2); + } + if (f != stdin) fclose (f); +} + +#endif + int FDECL2(main, int, argc, char **, argv){ char * outfile; struct directory_entry de; @@ -374,6 +531,9 @@ int FDECL2(main, int, argc, char **, argv){ struct stat statbuf; char * scan_tree; int c; +#ifdef ADD_FILES + char *add_file_file = NULL; +#endif if (argc < 2) usage(); @@ -382,7 +542,7 @@ int FDECL2(main, int, argc, char **, argv){ read_rcfile(argv[0]); outfile = NULL; - while ((c = getopt(argc, argv, "o:V:RfvaTp:P:x:dDlNzA:")) != EOF) + while ((c = getopt(argc, argv, "i:o:V:RfvaTp:P:x:dDlLNzA:")) != EOF) switch (c) { case 'p': @@ -415,6 +575,9 @@ int FDECL2(main, int, argc, char **, argv){ case 'l': full_iso9660_filenames++; break; + case 'L': + allow_leading_dots++; + break; case 'N': omit_version_number++; break; @@ -450,6 +613,11 @@ int FDECL2(main, int, argc, char **, argv){ case 'x': exclude(optarg); break; + case 'i': +#ifdef ADD_FILES + add_file_file = optarg; + break; +#endif default: usage(); exit(1); @@ -478,6 +646,13 @@ int FDECL2(main, int, argc, char **, argv){ scan_tree = argv[optind]; +#ifdef ADD_FILES + if (add_file_file) { + add_file(add_file_file); + } + add_file_list (argc, argv, optind+1); +#endif + if(!scan_tree){ usage(); exit(1); @@ -499,7 +674,7 @@ int FDECL2(main, int, argc, char **, argv){ #else extension_record = generate_rr_extension_record("IEEE_P1282", "THE IEEE P1282 PROTOCOL PROVIDES SUPPORT FOR POSIX FILE SYSTEM SEMANTICS", - "PLEASE CONTACT THE IEEE STANDARDS DEPARTMENT,PISCATAWAY, NJ, USA FOR THE P1282 SPECIFICATION.", &extension_record_size); + "PLEASE CONTACT THE IEEE STANDARDS DEPARTMENT, PISCATAWAY, NJ, USA FOR THE P1282 SPECIFICATION.", &extension_record_size); #endif }; diff --git a/gnu/usr.bin/mkisofs/mkisofs.h b/gnu/usr.bin/mkisofs/mkisofs.h index e17bb84..f7c43ca 100644 --- a/gnu/usr.bin/mkisofs/mkisofs.h +++ b/gnu/usr.bin/mkisofs/mkisofs.h @@ -19,6 +19,8 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* ADD_FILES changes made by Ross Biro biro@yggdrasil.com 2/23/95 */ + #include <stdio.h> /* This symbol is used to indicate that we do not have things like @@ -100,6 +102,7 @@ struct directory_entry{ unsigned int priority; char * name; char * table; + char * whole_name; struct directory * filedir; struct directory_entry * parent_rec; unsigned int flags; @@ -141,6 +144,23 @@ struct deferred{ unsigned int flags; }; +#ifdef ADD_FILES +struct file_adds { + char *name; + struct file_adds *child; + struct file_adds *next; + int add_count; + int used; + struct dirent de; + struct { + char *path; + char *name; + } *adds; +}; +extern struct file_adds *root_file_adds; + +#endif + extern void DECL(sort_n_finish,(struct directory *)); extern int goof; extern struct directory * root; diff --git a/gnu/usr.bin/mkisofs/rock.c b/gnu/usr.bin/mkisofs/rock.c index dfa774f..f3361ce 100644 --- a/gnu/usr.bin/mkisofs/rock.c +++ b/gnu/usr.bin/mkisofs/rock.c @@ -279,7 +279,7 @@ int deep_opt; nchar -= 1; } else if(cpnt[0] == 0){ if(MAYBE_ADD_CE_ENTRY(2)) add_CE_entry(); - Rock[ipnt++] = SL_ROOT; + Rock[ipnt++] = (cpnt == &symlink_buff[0] ? SL_ROOT : 0); Rock[ipnt++] = 0; /* length is zero */ lenval += 2; } else { diff --git a/gnu/usr.bin/mkisofs/tree.c b/gnu/usr.bin/mkisofs/tree.c index c07c52e..5060c41 100644 --- a/gnu/usr.bin/mkisofs/tree.c +++ b/gnu/usr.bin/mkisofs/tree.c @@ -20,16 +20,22 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* ADD_FILES changes made by Ross Biro biro@yggdrasil.com 2/23/95 */ + #include <stdlib.h> #include <string.h> #include <time.h> #include <errno.h> #ifndef VMS -#include <unistd.h> -#ifdef HASSYSMACROS +#if defined(HASSYSMACROS) && !defined(HASMKDEV) #include <sys/sysmacros.h> #endif +#include <unistd.h> +#ifdef HASMKDEV +#include <sys/types.h> +#include <sys/mkdev.h> +#endif #else #include <sys/file.h> #include <vms/fabdef.h> @@ -475,6 +481,89 @@ void finish_cl_pl_entries(){ d_entry = d_entry->next; }; } + +#ifdef ADD_FILES +/* This function looks up additions. */ +char * +FDECL3(look_up_addition,char **, newpath, char *,path, struct dirent **,de) { + char *dup_path; + char *cp; + struct file_adds *f; + struct file_adds *tmp; + + f=root_file_adds; + if (!f) return NULL; + + /* I don't trust strtok */ + dup_path = strdup (path); + + cp = strtok (dup_path, SPATH_SEPARATOR); + while (cp != NULL) { + for (tmp = f->child; tmp != NULL; tmp=tmp->next) { + if (strcmp (tmp->name, cp) == 0) break; + } + if (tmp == NULL) { + /* no match */ + free (dup_path); + return (NULL); + } + f = tmp; + cp = strtok(NULL, SPATH_SEPARATOR); + } + free (dup_path); + + /* looks like we found something. */ + if (tmp->used >= tmp->add_count) return (NULL); + + *newpath = tmp->adds[tmp->used].path; + tmp->used++; + *de = &(tmp->de); + return (tmp->adds[tmp->used-1].name); + +} + +/* This function lets us add files from outside the standard file tree. + It is useful if we want to duplicate a cd, but add/replace things. + We should note that the real path will be used for exclusions. */ + +struct dirent * +FDECL3(readdir_add_files, char **, pathp, char *,path, DIR *, dir){ + struct dirent *de; + + char *addpath; + char *name; + + de = readdir (dir); + if (de) { + return (de); + } + + name=look_up_addition (&addpath, path, &de); + + if (!name) { + return; + } + + *pathp=addpath; + + /* Now we must create the directory entry. */ + /* fortuneately only the name seems to matter. */ + /* + de->d_ino = -1; + de->d_off = 0; + de->d_reclen = strlen (name); + */ + strncpy (de->d_name, name, NAME_MAX); + de->d_name[NAME_MAX]=0; + return (de); + +} +#else +struct dirent * +FDECL3(readdir_add_files, char **, pathp, char *,path, DIR *, dir){ + return (readdir (dir)); +} +#endif /* * This function scans the directory tree, looking for files, and it makes * note of everything that is found. We also begin to construct the ISO9660 @@ -493,6 +582,7 @@ FDECL2(scan_directory_tree,char *, path, struct directory_entry *, de){ char * cpnt; int new_reclen; int deep_flag; + char *old_path; current_dir = opendir(path); d_entry = NULL; @@ -500,7 +590,9 @@ FDECL2(scan_directory_tree,char *, path, struct directory_entry *, de){ /* Apparently NFS sometimes allows you to open the directory, but then refuses to allow you to read the contents. Allow for this */ - if(current_dir) d_entry = readdir(current_dir); + old_path = path; + + if(current_dir) d_entry = readdir_add_files(&path, old_path, current_dir); if(!current_dir || !d_entry) { fprintf(stderr,"Unable to open directory %s\n", path); @@ -578,7 +670,7 @@ FDECL2(scan_directory_tree,char *, path, struct directory_entry *, de){ /* The first time through, skip this, since we already asked for the first entry when we opened the directory. */ - if(dflag) d_entry = readdir(current_dir); + if(dflag) d_entry = readdir_add_files(&path, old_path, current_dir); dflag++; if(!d_entry) break; @@ -629,10 +721,11 @@ FDECL2(scan_directory_tree,char *, path, struct directory_entry *, de){ if(S_ISLNK(lstatbuf.st_mode)){ - /* Here we decide how to handle the symbolic links. Here we - handle the general case - if we are not following links or there is an - error, then we must change something. If RR is in use, it is easy, we - let RR describe the file. If not, then we punt the file. */ + /* Here we decide how to handle the symbolic links. Here + we handle the general case - if we are not following + links or there is an error, then we must change + something. If RR is in use, it is easy, we let RR + describe the file. If not, then we punt the file. */ if((status || !follow_links)){ if(use_RockRidge){ @@ -652,35 +745,50 @@ FDECL2(scan_directory_tree,char *, path, struct directory_entry *, de){ }; } - /* Here we handle a different kind of case. Here we have a symlink, - but we want to follow symlinks. If we run across a directory loop, - then we need to pretend that we are not following symlinks for this file. - If this is the first time we have seen this, then make this seem - as if there was no symlink there in the first place */ - - else if(strcmp(d_entry->d_name, ".") && - strcmp(d_entry->d_name, "..")) { - if(find_directory_hash(statbuf.st_dev, STAT_INODE(statbuf))){ - fprintf(stderr, "Infinite loop detected (%s)\n", whole_path); - if(!use_RockRidge) continue; - statbuf.st_size = 0; - STAT_INODE(statbuf) = UNCACHED_INODE; - statbuf.st_dev = (dev_t) UNCACHED_DEVICE; - statbuf.st_mode = (statbuf.st_mode & ~S_IFMT) | S_IFREG; + if( follow_links + && S_ISDIR(statbuf.st_mode) ) + { + if( strcmp(d_entry->d_name, ".") + && strcmp(d_entry->d_name, "..") ) + { + if(find_directory_hash(statbuf.st_dev, STAT_INODE(statbuf))) + { + if(!use_RockRidge) + { + fprintf(stderr, "Already cached directory seen (%s)\n", + whole_path); + continue; + } + statbuf.st_size = 0; + STAT_INODE(statbuf) = UNCACHED_INODE; + statbuf.st_dev = (dev_t) UNCACHED_DEVICE; + statbuf.st_mode = (statbuf.st_mode & ~S_IFMT) | S_IFREG; } else { - lstatbuf = statbuf; - add_directory_hash(statbuf.st_dev, STAT_INODE(statbuf)); - }; - }; - }; + lstatbuf = statbuf; + add_directory_hash(statbuf.st_dev, STAT_INODE(statbuf)); + } + } + } + } + /* + * Add directories to the cache so that we don't waste space even + * if we are supposed to be following symlinks. + */ + if( follow_links + && strcmp(d_entry->d_name, ".") + && strcmp(d_entry->d_name, "..") + && S_ISDIR(statbuf.st_mode) ) + { + add_directory_hash(statbuf.st_dev, STAT_INODE(statbuf)); + } #ifdef VMS if(!S_ISDIR(lstatbuf.st_mode) && (statbuf.st_fab_rfm != FAB$C_FIX && statbuf.st_fab_rfm != FAB$C_STMLF)) { fprintf(stderr,"Warning - file %s has an unsupported VMS record" " format (%d)\n", whole_path, statbuf.st_fab_rfm); - }; + } #endif if(S_ISREG(lstatbuf.st_mode) && (status = access(whole_path, R_OK))){ @@ -691,11 +799,15 @@ FDECL2(scan_directory_tree,char *, path, struct directory_entry *, de){ /* Add this so that we can detect directory loops with hard links. If we are set up to follow symlinks, then we skip this checking. */ - if(!follow_links && S_ISDIR(lstatbuf.st_mode) && strcmp(d_entry->d_name, ".") && - strcmp(d_entry->d_name, "..")) { + if( !follow_links + && S_ISDIR(lstatbuf.st_mode) + && strcmp(d_entry->d_name, ".") + && strcmp(d_entry->d_name, "..") ) + { if(find_directory_hash(statbuf.st_dev, STAT_INODE(statbuf))) { - fprintf(stderr,"Directory loop - fatal goof (%s %x %d).\n", - whole_path, statbuf.st_dev, STAT_INODE(statbuf)); + fprintf(stderr,"Directory loop - fatal goof (%s %lx %lu).\n", + whole_path, (unsigned long) statbuf.st_dev, + (unsigned long) STAT_INODE(statbuf)); exit(1); }; add_directory_hash(statbuf.st_dev, STAT_INODE(statbuf)); @@ -727,6 +839,7 @@ FDECL2(scan_directory_tree,char *, path, struct directory_entry *, de){ s_entry->table = NULL; s_entry->name = strdup(d_entry->d_name); + s_entry->whole_name = strdup (whole_path); s_entry->filedir = this_dir; s_entry->isorec.flags[0] = 0; @@ -810,18 +923,20 @@ FDECL2(scan_directory_tree,char *, path, struct directory_entry *, de){ break; #ifndef NON_UNIXFS case S_IFBLK: - sprintf(buffer,"B\t%s\t%d %d\n", + sprintf(buffer,"B\t%s\t%lu %lu\n", s_entry->name, - major(statbuf.st_rdev), minor(statbuf.st_rdev)); + (unsigned long) major(statbuf.st_rdev), + (unsigned long) minor(statbuf.st_rdev)); break; case S_IFIFO: sprintf(buffer,"P\t%s\n", s_entry->name); break; case S_IFCHR: - sprintf(buffer,"C\t%s\t%d %d\n", + sprintf(buffer,"C\t%s\t%lu %lu\n", s_entry->name, - major(statbuf.st_rdev), minor(statbuf.st_rdev)); + (unsigned long) major(statbuf.st_rdev), + (unsigned long) minor(statbuf.st_rdev)); break; case S_IFLNK: readlink(whole_path, symlink_buff, sizeof(symlink_buff)); diff --git a/gnu/usr.bin/mkisofs/write.c b/gnu/usr.bin/mkisofs/write.c index 3a98a39..64b4a3c 100644 --- a/gnu/usr.bin/mkisofs/write.c +++ b/gnu/usr.bin/mkisofs/write.c @@ -376,11 +376,7 @@ static void FDECL1(assign_file_addresses, struct directory *, dpnt){ dwpnt->name = NULL; } else { dwpnt->table = NULL; - strcpy(whole_path, s_entry->filedir->whole_name); -#ifndef VMS - if(strlen(whole_path)) strcat(whole_path, "/"); -#endif - strcat(whole_path, s_entry->name); + strcpy(whole_path, s_entry->whole_name); dwpnt->name = strdup(whole_path); }; dwpnt->next = NULL; @@ -407,8 +403,15 @@ static void FDECL1(assign_file_addresses, struct directory *, dpnt){ fprintf(stderr,"Reported file size is %d extents\n", s_entry->size); exit(1); }; - } else - set_733(s_entry->isorec.extent, 0); + } else { + /* + * This is for zero-length files. If we leave the extent 0, + * then we get screwed, because many readers simply drop files + * that have an extent of zero. Thus we leave the size 0, + * and just assign the extent number. + */ + set_733(s_entry->isorec.extent, last_extent); + } }; }; }; |