Pull -graft-points option from mkisofs-1.13 and cdrtools-2.01.

Also remove #ifdef APPLE_HYB for NON-HFS changes to reduce diffs.
This commit is contained in:
tsutsui 2024-05-31 20:48:22 +00:00
parent b1bd5b8fae
commit 61957e4641
4 changed files with 237 additions and 92 deletions

View File

@ -228,8 +228,7 @@ intptr_t hfs_ishidden()
{
return((intptr_t)hfs_mat[0]);
}
/* These will probably appear in mkisofs in the future */
#endif /* APPLE_HYB */
void add_list(file)
char *file;
@ -293,5 +292,3 @@ char *file;
fclose(fp);
}
#endif /* APPLE_HYB */

View File

@ -27,8 +27,8 @@ int hfs_add_match __PR((char *fn));
void hfs_add_list __PR((char *fn));
int hfs_matches __PR((char *fn));
intptr_t hfs_ishidden __PR((void));
#endif /* APPLE_HYB */
void add_list __PR((char *fn));
void i_add_list __PR((char *fn));
void j_add_list __PR((char *fn));
#endif /* APPLE_HYB */

View File

@ -104,6 +104,7 @@ char * boot_image = BOOT_IMAGE_DEFAULT;
int volume_set_size = 1;
int volume_sequence_number = 1;
int use_graft_ptrs = 0; /* Use graft points */
int jhide_trans_tbl; /* Hide TRANS.TBL from Joliet tree */
int hide_rr_moved; /* Name RR_MOVED .rr_moved in Rock Ridge tree */
int omit_period = 0; /* Violates iso9660, but these are a pain */
@ -219,6 +220,34 @@ struct ld_option
#endif
#define OPTION_HIDE_TRANS_TBL 175
#define OPTION_HIDE_RR_MOVED 176
#if 0
#define OPTION_GUI 177
#define OPTION_TRANS_TBL 178
#define OPTION_P_LIST 179
#define OPTION_I_LIST 180
#define OPTION_J_LIST 181
#define OPTION_X_LIST 182
#define OPTION_NO_RR 183
#define OPTION_JCHARSET 184
#define OPTION_PAD 185
#define OPTION_H_HIDE 186
#define OPTION_H_LIST 187
#define OPTION_CHECK_OLDNAMES 188
#ifdef SORTING
#define OPTION_SORT 189
#endif /* SORTING */
#define OPTION_UCS_LEVEL 190
#define OPTION_ISO_TRANSLATE 191
#define OPTION_ISO_LEVEL 192
#define OPTION_RELAXED_FILENAMES 193
#define OPTION_ALLOW_LOWERCASE 194
#define OPTION_ALLOW_MULTIDOT 195
#define OPTION_USE_FILEVERSION 196
#define OPTION_MAX_FILENAMES 197
#define OPTION_ALT_BOOT 198
#endif
#define OPTION_USE_GRAFT 199
#ifdef APPLE_HYB
#define OPTION_CAP 200
@ -251,14 +280,19 @@ struct ld_option
#define OPTION_HFS_VOLID 231
#define OPTION_H_LIST 240
#endif /* APPLE_HYB */
#define OPTION_P_LIST 241
#define OPTION_I_LIST 242
#define OPTION_J_LIST 243
#define OPTION_X_LIST 244
#ifdef APPLE_HYB
#define OPTION_HFS_BLESS 245
#endif /* APPLE_HYB */
static int save_pname = 0;
static const struct ld_option ld_options[] =
{
{ {"all-files", no_argument, NULL, 'a'},
@ -283,26 +317,22 @@ static const struct ld_option ld_options[] =
'D', NULL, "Disable deep directory relocation", ONE_DASH },
{ {"follow-links", no_argument, NULL, 'f'},
'f', NULL, "Follow symbolic links", ONE_DASH },
{{"graft-points", no_argument, NULL, OPTION_USE_GRAFT},
'\0', NULL, "Allow to use graft points for filenames", ONE_DASH},
{ {"help", no_argument, NULL, OPTION_HELP},
'\0', NULL, "Print option help", ONE_DASH },
{ {"hide", required_argument, NULL, OPTION_I_HIDE},
'\0', "GLOBFILE", "Hide ISO9660/RR file" , ONE_DASH },
#ifdef APPLE_HYB
/* NON-HFS change */
{ {"hide-list", required_argument, NULL, OPTION_I_LIST},
'\0', "FILE", "list of ISO9660/RR files to hide" , ONE_DASH },
#endif /* APPLE_HYB */
{ {"hide-joliet", required_argument, NULL, OPTION_J_HIDE},
'\0', "GLOBFILE", "Hide Joliet file" , ONE_DASH },
#ifdef APPLE_HYB
/* NON-HFS change */
{ {"hide-joliet-list", required_argument, NULL, OPTION_J_LIST},
'\0', "FILE", "List of Joliet files to hide" , ONE_DASH },
{{"hide-joliet-trans-tbl", no_argument, NULL, OPTION_HIDE_TRANS_TBL},
'\0', NULL, "Hide TRANS.TBL from Joliet tree", ONE_DASH},
{{"hide-rr-moved", no_argument, NULL, OPTION_HIDE_RR_MOVED},
'\0', NULL, "Rename RR_MOVED to .rr_moved in Rock Ridge tree", ONE_DASH},
#endif /* APPLE_HYB */
{ {NULL, required_argument, NULL, 'i'},
'i', "ADD_FILES", "No longer supported" , TWO_DASHES },
{ {"joliet", no_argument, NULL, 'J'},
@ -315,10 +345,8 @@ static const struct ld_option ld_options[] =
'\0', "LOG_FILE", "Re-direct messages to LOG_FILE", ONE_DASH },
{ {"exclude", required_argument, NULL, 'm'},
'm', "GLOBFILE", "Exclude file name" , ONE_DASH },
#ifdef APPLE_HYB
{ {"exclude-list", required_argument, NULL, OPTION_X_LIST},
'm', "FILE", "List of file names to exclude" , ONE_DASH },
#endif /* APPLE_HYB */
{ {"prev-session", required_argument, NULL, 'M'},
'M', "FILE", "Set path to previous session to merge" , ONE_DASH },
{ {"omit-version-number", no_argument, NULL, 'N'},
@ -329,10 +357,8 @@ static const struct ld_option ld_options[] =
0, NULL, "Inhibit splitting symlink fields" , ONE_DASH },
{ {"output", required_argument, NULL, 'o'},
'o', "FILE", "Set output file name" , ONE_DASH },
#ifdef APPLE_HYB
{ {"path-list", required_argument, NULL, OPTION_P_LIST},
'\0', "FILE", "list of pathnames to process" , ONE_DASH },
#endif /* APPLE_HYB */
{ {"preparer", required_argument, NULL, 'p'},
'p', "PREP", "Set Volume preparer" , ONE_DASH },
{ {"print-size", no_argument, NULL, OPTION_PRINT_SIZE},
@ -436,6 +462,12 @@ char *s;{char *c;if(c=(char *)malloc(strlen(s)+1))strcpy(c,s);return c;}
void read_rcfile __PR((char * appname));
void usage __PR((void));
static void hide_reloc_dir __PR((void));
static char * get_pnames __PR((int argc, char **argv, int opt,
char *pname, int pnsize, FILE * fp));
int main __PR((int argc, char **argv));
char * findequal __PR((char *s));
char * escstrcpy __PR((char *to, char *from));
void FDECL1(read_rcfile, char *, appname)
{
@ -755,16 +787,30 @@ hide_reloc_dir()
/* get pathnames from the command line, and then from given file */
static char *
FDECL5(get_pnames, int, argc, char **, argv, int, opt, char *, pname, FILE *, fp)
get_pnames(int argc, char **argv, int opt, char *pname, int pnsize, FILE * fp)
{
int len;
/* we may of already read the first line from the pathnames file */
if (save_pname) {
save_pname = 0;
return (pname);
}
if (opt < argc)
return (argv[opt]);
if (fp == NULL)
return ((char *)0);
if (fscanf(fp, "%s", pname) != EOF)
return (pname);
if (fgets(pname, pnsize, fp)) {
/* Discard newline */
len = strlen(pname);
if (pname[len - 1] == '\n') {
pname[len - 1] = '\0';
}
return (pname);
}
return ((char *)0);
}
@ -777,7 +823,6 @@ int FDECL2(main, int, argc, char **, argv){
unsigned long mem_start;
#endif
struct stat statbuf;
char * scan_tree;
char * merge_image = NULL;
struct iso_directory_record * mrootp = NULL;
struct output_fragment * opnt;
@ -786,12 +831,16 @@ int FDECL2(main, int, argc, char **, argv){
struct option longopts[OPTION_COUNT + 1];
int c;
char *log_file = 0;
#ifdef APPLE_HYB
char *afpfile = ""; /* mapping file for TYPE/CREATOR */
char *node = NULL;
char *pathnames = 0;
FILE *pfp = NULL;
char pname[1024], *arg;
int no_path_names = 0;
char pname[2*PATH_MAX + 1 + 1]; /* may be too short */
char *arg; /* if '\\' present */
char nodename[PATH_MAX + 1];
int no_path_names = 1;
int have_cmd_line_pathspec = 0;
#ifdef APPLE_HYB
char *afpfile = ""; /* mapping file for TYPE/CREATOR */
#endif /* APPLE_HYB */
if (argc < 2)
@ -850,7 +899,12 @@ int FDECL2(main, int, argc, char **, argv){
* A filename that we take as input.
*/
optind--;
have_cmd_line_pathspec = 1;
goto parse_input_files;
case OPTION_USE_GRAFT:
use_graft_ptrs = 1;
break;
case 'C':
/*
* This is a temporary hack until cdwrite gets the proper hooks in
@ -1132,8 +1186,7 @@ int FDECL2(main, int, argc, char **, argv){
case OPTION_H_LIST:
hfs_add_list(optarg);
break;
/* NON-HFS change
The next options will probably appear in mkisofs in the future */
#endif /* APPLE_HYB */
case OPTION_P_LIST:
pathnames = optarg;
break;
@ -1146,7 +1199,6 @@ int FDECL2(main, int, argc, char **, argv){
case OPTION_J_LIST:
j_add_list(optarg);
break;
#endif /* APPLE_HYB */
default:
usage();
exit(1);
@ -1220,23 +1272,37 @@ parse_input_files:
fprintf(stderr,"Warning: -C specified without -M: old session data will not be merged.\n");
}
/*
* see if we have a list of pathnames to process
*/
if (pathnames) {
/* "-" means take list from the standard input */
if (strcmp(pathnames, "-")) {
if ((pfp = fopen(pathnames, "r")) == NULL) {
fprintf(stderr,
"Unable to open pathname list %s.\n", pathnames);
exit(1);
}
} else
pfp = stdin;
}
/* The first step is to scan the directory tree, and take some notes */
scan_tree = argv[optind];
if(!scan_tree){
if ((arg = get_pnames(argc, argv, optind, pname,
sizeof(pname), pfp)) == NULL) {
usage();
exit(1);
};
#ifndef VMS
if(scan_tree[strlen(scan_tree)-1] != '/') {
scan_tree = (char *) e_malloc(strlen(argv[optind])+2);
strcpy(scan_tree, argv[optind]);
strcat(scan_tree, "/");
};
#endif
/*
* if we don't have a pathspec, then save the pathspec found
* in the pathnames file (stored in pname) - we don't want
* to skip this pathspec when we read the pathnames file again
*/
if (!have_cmd_line_pathspec) {
save_pname = 1;
}
if(use_RockRidge){
#if 1
@ -1277,7 +1343,23 @@ parse_input_files:
fprintf(stderr,"\n%s\n", version_string);
}
}
/* Find name of root directory. */
if (arg != NULL)
node = findequal(arg);
if (!use_graft_ptrs)
node = NULL;
if (node == NULL) {
if (use_graft_ptrs && arg != NULL)
node = escstrcpy(nodename, arg);
else
node = arg;
} else {
/*
* Remove '\\' escape chars which are located
* before '\\' and '=' chars
*/
node = escstrcpy(nodename, ++node);
}
/*
* See if boot catalog file exists in root directory, if not
* we will create it.
@ -1324,40 +1406,20 @@ parse_input_files:
*/
find_or_create_directory(NULL, "", &de, TRUE);
#ifdef APPLE_HYB
/* NON-HFS change: see if we have a list of pathnames to process */
if (pathnames) {
/* "-" means take list from the standard input */
if (strcmp(pathnames, "-")) {
if ((pfp = fopen(pathnames, "r")) == NULL) {
fprintf(stderr, "unable to open pathname list %s\n",pathnames);
exit (1);
}
}
else
pfp = stdin;
}
#endif /* APPLE_HYB */
/*
* Scan the actual directory (and any we find below it)
* for files to write out to the output image. Note - we
* take multiple source directories and keep merging them
* onto the image.
*/
#if APPLE_HYB
/* NON-HFS change */
while((arg = get_pnames(argc, argv, optind, pname, pfp)) != NULL)
#else
while(optind < argc)
#endif /* APPLE_HYB */
while((arg = get_pnames(argc, argv, optind, pname,
sizeof(pname), pfp)) != NULL)
{
char * node;
struct directory * graft_dir;
struct stat st;
char * short_name;
int status;
char graft_point[1024];
char graft_point[PATH_MAX + 1];
/*
* We would like a syntax like:
@ -1382,42 +1444,86 @@ parse_input_files:
* The default will be that the file is injected at the
* root of the image tree.
*/
#ifdef APPLE_HYB
/* NON-HFS change */
node = strchr(arg, '=');
#else
node = strchr(argv[optind], '=');
#endif /* APPLE_HYB */
node = findequal(arg);
if (!use_graft_ptrs)
node = NULL;
/*
* Remove '\\' escape chars which are located
* before '\\' and '=' chars ---> below in escstrcpy()
*/
short_name = NULL;
if( node != NULL )
{
char * pnt;
char * xpnt;
size_t len;
*node = '\0';
#ifdef APPLE_HYB
/* NON-HFS change */
strcpy(graft_point, arg);
#else
strcpy(graft_point, argv[optind]);
#endif /* APPLE_HYB */
*node = '=';
node++;
if (node) {
*node = '\0';
escstrcpy(graft_point, arg);
*node = '=';
}
/*
* Remove unwanted "./" & "/" sequences from start...
*/
do {
xpnt = graft_point;
while (xpnt[0] == '.' && xpnt[1] == '/')
xpnt += 2;
while (*xpnt == PATH_SEPARATOR) {
xpnt++;
}
strcpy(graft_point, xpnt);
} while (xpnt > graft_point);
if (node) {
node = escstrcpy(nodename, ++node);
} else {
node = arg;
}
graft_dir = root;
xpnt = graft_point;
if( *xpnt == PATH_SEPARATOR )
{
xpnt++;
/*
* If "node" points to a directory, then graft_point
* needs to point to a directory too.
*/
if (follow_links)
status = stat_filter(node, &st);
else
status = lstat_filter(node, &st);
if (status == 0 && S_ISDIR(st.st_mode)) {
len = strlen(graft_point);
if ((len <= (sizeof (graft_point) -1)) &&
graft_point[len-1] != '/') {
graft_point[len++] = '/';
graft_point[len] = '\0';
}
}
/*
* Loop down deeper and deeper until we
* find the correct insertion spot.
* Canonicalize the filename while parsing it.
*/
while(1==1)
{
do {
while (xpnt[0] == '.' && xpnt[1] == '/')
xpnt += 2;
while (xpnt[0] == '/')
xpnt += 1;
if (xpnt[0] == '.' && xpnt[1] == '.' && xpnt[2] == '/') {
if (graft_dir && graft_dir != root) {
graft_dir = graft_dir->parent;
xpnt += 2;
}
}
} while ((xpnt[0] == '/') || (xpnt[0] == '.' && xpnt[1] == '/'));
pnt = strchr(xpnt, PATH_SEPARATOR);
if( pnt == NULL )
{
@ -1438,19 +1544,20 @@ parse_input_files:
else
{
graft_dir = root;
#ifdef APPLE_HYB
/* NON-HFS change */
node = arg;
#else
node = argv[optind];
#endif /* APPLE_HYB */
if (use_graft_ptrs)
node = escstrcpy(nodename, arg);
else
node = arg;
}
/*
* Now see whether the user wants to add a regular file,
* or a directory at this point.
*/
status = stat_filter(node, &st);
if (follow_links)
status = stat_filter(node, &st);
else
status = lstat_filter(node, &st);
if( status != 0 )
{
/*
@ -1495,14 +1602,9 @@ parse_input_files:
}
optind++;
#ifdef APPLE_HYB
/* NON-HFS change */
no_path_names = 0;
#endif /* APPLE_HYB */
}
#ifdef APPLE_HYB
/* NON-HFS change */
if (pfp && pfp != stdin)
fclose(pfp);
@ -1512,7 +1614,6 @@ parse_input_files:
usage();
exit(1);
};
#endif /* APPLE_HYB */
/*
* Now merge in any previous sessions. This is driven on the source
@ -1710,6 +1811,44 @@ parse_input_files:
#endif
}
/*
* Find unescaped equal sign in string.
*/
char *
findequal(char *s)
{
char *p = s;
while ((p = strchr(p, '=')) != NULL) {
if (p > s && p[-1] != '\\')
return (p);
p++;
}
return (NULL);
}
/*
* Find unescaped equal sign in string.
*/
char *
escstrcpy(char *to, char *from)
{
char *p = to;
while ((*p = *from++) != '\0') {
if (*p == '\\' || *p == '=') {
if (p[-1] == '\\') {
--p;
p[0] = p[1];
}
}
p++;
}
return (to);
}
void *
FDECL1(e_malloc, size_t, size)
{

View File

@ -528,6 +528,7 @@ extern void * DECL(e_malloc,(size_t));
* Make sure we have a definition for this. If not, take a very conservative
* guess. From what I can tell SunOS is the only one with this trouble.
*/
#include <limits.h>
#ifndef NAME_MAX
#ifdef FILENAME_MAX
#define NAME_MAX FILENAME_MAX
@ -535,3 +536,11 @@ extern void * DECL(e_malloc,(size_t));
#define NAME_MAX 128
#endif
#endif
#ifndef PATH_MAX
#ifdef FILENAME_MAX
#define PATH_MAX FILENAME_MAX
#else
#define PATH_MAX 1024
#endif
#endif