summaryrefslogtreecommitdiffstats
path: root/gnu
diff options
context:
space:
mode:
authorjoerg <joerg@FreeBSD.org>1995-10-22 14:04:37 +0000
committerjoerg <joerg@FreeBSD.org>1995-10-22 14:04:37 +0000
commit1d53384641b8ce578b1a1b19960a9656e46526dc (patch)
treebcf7036fe42c6460094c5b6d1532e62010855635 /gnu
parent4859036a7b7d95d1469f37948c869f363e013c70 (diff)
downloadFreeBSD-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.in4
-rw-r--r--gnu/usr.bin/mkisofs/defaults.h16
-rw-r--r--gnu/usr.bin/mkisofs/diag/Makefile16
-rw-r--r--gnu/usr.bin/mkisofs/diag/isodump.c16
-rw-r--r--gnu/usr.bin/mkisofs/diag/isovfy.c13
-rw-r--r--gnu/usr.bin/mkisofs/exclude.c3
-rw-r--r--gnu/usr.bin/mkisofs/mkisofs.c189
-rw-r--r--gnu/usr.bin/mkisofs/mkisofs.h20
-rw-r--r--gnu/usr.bin/mkisofs/rock.c2
-rw-r--r--gnu/usr.bin/mkisofs/tree.c189
-rw-r--r--gnu/usr.bin/mkisofs/write.c17
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);
+ }
};
};
};
OpenPOWER on IntegriCloud