mirror of
https://git.savannah.gnu.org/git/tar.git
synced 2026-07-20 15:02:35 +00:00
*** empty log message ***
This commit is contained in:
+244
-243
@@ -403,7 +403,7 @@ child_open ()
|
||||
}
|
||||
else /* This can't happen if (ar_reading==2)
|
||||
archive = rmtopen(ar_files[0], O_RDWR|O_CREAT|O_BINARY, 0666);
|
||||
else */ if (ar_reading)
|
||||
else */ if (ar_reading)
|
||||
archive = rmtopen (ar_files[0], O_RDONLY | O_BINARY, 0666);
|
||||
else
|
||||
archive = rmtcreat (ar_files[0], 0666);
|
||||
@@ -1277,31 +1277,31 @@ close_archive ()
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Child voluntarily terminated -- but why? */
|
||||
if (WEXITSTATUS (status) == MAGIC_STAT)
|
||||
{
|
||||
exit (EX_SYSTEM); /* Child had trouble */
|
||||
}
|
||||
if (WEXITSTATUS (status) == (SIGPIPE + 128))
|
||||
{
|
||||
/*
|
||||
/* Child voluntarily terminated -- but why? */
|
||||
if (WEXITSTATUS (status) == MAGIC_STAT)
|
||||
{
|
||||
exit (EX_SYSTEM); /* Child had trouble */
|
||||
}
|
||||
if (WEXITSTATUS (status) == (SIGPIPE + 128))
|
||||
{
|
||||
/*
|
||||
* /bin/sh returns this if its child
|
||||
* dies with SIGPIPE. 'Sok.
|
||||
*/
|
||||
break;
|
||||
}
|
||||
else if (WEXITSTATUS (status))
|
||||
msg ("child returned status %d",
|
||||
WEXITSTATUS (status));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if (WEXITSTATUS (status))
|
||||
msg ("child returned status %d",
|
||||
WEXITSTATUS (status));
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* __MSDOS__ */
|
||||
}
|
||||
|
||||
|
||||
#ifdef DONTDEF
|
||||
/*
|
||||
/*
|
||||
* Message management.
|
||||
*
|
||||
* anno writes a message prefix on stream (eg stdout, stderr).
|
||||
@@ -1316,264 +1316,265 @@ close_archive ()
|
||||
* If the third argument is 1, the "saved" record # is used; if 0, the
|
||||
* "current" record # is used.
|
||||
*/
|
||||
void
|
||||
anno (stream, prefix, savedp)
|
||||
FILE *stream;
|
||||
char *prefix;
|
||||
int savedp;
|
||||
{
|
||||
void
|
||||
anno (stream, prefix, savedp)
|
||||
FILE *stream;
|
||||
char *prefix;
|
||||
int savedp;
|
||||
{
|
||||
# define MAXANNO 50
|
||||
char buffer[MAXANNO]; /* Holds annorecment */
|
||||
char buffer[MAXANNO]; /* Holds annorecment */
|
||||
# define ANNOWIDTH 13
|
||||
int space;
|
||||
long offset;
|
||||
int save_e;
|
||||
int space;
|
||||
long offset;
|
||||
int save_e;
|
||||
|
||||
save_e = errno;
|
||||
/* Make sure previous output gets out in sequence */
|
||||
if (stream == stderr)
|
||||
fflush (stdout);
|
||||
if (f_sayblock)
|
||||
{
|
||||
if (prefix)
|
||||
{
|
||||
fputs (prefix, stream);
|
||||
putc (' ', stream);
|
||||
}
|
||||
offset = ar_record - ar_block;
|
||||
(void) sprintf (buffer, "rec %d: ",
|
||||
savedp ? saved_recno :
|
||||
baserec + offset);
|
||||
fputs (buffer, stream);
|
||||
space = ANNOWIDTH - strlen (buffer);
|
||||
if (space > 0)
|
||||
{
|
||||
fprintf (stream, "%*s", space, "");
|
||||
}
|
||||
}
|
||||
else if (prefix)
|
||||
{
|
||||
fputs (prefix, stream);
|
||||
fputs (": ", stream);
|
||||
}
|
||||
errno = save_e;
|
||||
}
|
||||
|
||||
save_e = errno;
|
||||
/* Make sure previous output gets out in sequence */
|
||||
if (stream == stderr)
|
||||
fflush (stdout);
|
||||
if (f_sayblock)
|
||||
{
|
||||
if (prefix)
|
||||
{
|
||||
fputs (prefix, stream);
|
||||
putc (' ', stream);
|
||||
}
|
||||
offset = ar_record - ar_block;
|
||||
(void) sprintf (buffer, "rec %d: ",
|
||||
savedp ? saved_recno :
|
||||
baserec + offset);
|
||||
fputs (buffer, stream);
|
||||
space = ANNOWIDTH - strlen (buffer);
|
||||
if (space > 0)
|
||||
{
|
||||
fprintf (stream, "%*s", space, "");
|
||||
}
|
||||
}
|
||||
else if (prefix)
|
||||
{
|
||||
fputs (prefix, stream);
|
||||
fputs (": ", stream);
|
||||
}
|
||||
errno = save_e;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Called to initialize the global volume number. */
|
||||
int
|
||||
init_volume_number ()
|
||||
{
|
||||
FILE *vf;
|
||||
/* Called to initialize the global volume number. */
|
||||
int
|
||||
init_volume_number ()
|
||||
{
|
||||
FILE *vf;
|
||||
|
||||
vf = fopen (f_volno_file, "r");
|
||||
if (!vf && errno != ENOENT)
|
||||
msg_perror ("%s", f_volno_file);
|
||||
vf = fopen (f_volno_file, "r");
|
||||
if (!vf && errno != ENOENT)
|
||||
msg_perror ("%s", f_volno_file);
|
||||
|
||||
if (vf)
|
||||
{
|
||||
fscanf (vf, "%d", &global_volno);
|
||||
fclose (vf);
|
||||
}
|
||||
}
|
||||
if (vf)
|
||||
{
|
||||
fscanf (vf, "%d", &global_volno);
|
||||
fclose (vf);
|
||||
}
|
||||
}
|
||||
|
||||
/* Called to write out the closing global volume number. */
|
||||
int
|
||||
closeout_volume_number ()
|
||||
{
|
||||
FILE *vf;
|
||||
/* Called to write out the closing global volume number. */
|
||||
int
|
||||
closeout_volume_number ()
|
||||
{
|
||||
FILE *vf;
|
||||
|
||||
vf = fopen (f_volno_file, "w");
|
||||
if (!vf)
|
||||
msg_perror ("%s", f_volno_file);
|
||||
else
|
||||
{
|
||||
fprintf (vf, "%d\n", global_volno);
|
||||
fclose (vf);
|
||||
}
|
||||
}
|
||||
vf = fopen (f_volno_file, "w");
|
||||
if (!vf)
|
||||
msg_perror ("%s", f_volno_file);
|
||||
else
|
||||
{
|
||||
fprintf (vf, "%d\n", global_volno);
|
||||
fclose (vf);
|
||||
}
|
||||
}
|
||||
|
||||
/* We've hit the end of the old volume. Close it and open the next one */
|
||||
/* Values for type: 0: writing 1: reading 2: updating */
|
||||
int
|
||||
new_volume (type)
|
||||
int type;
|
||||
{
|
||||
int c;
|
||||
char inbuf[80];
|
||||
char *p;
|
||||
static FILE *read_file = 0;
|
||||
extern int now_verifying;
|
||||
extern char TTY_NAME[];
|
||||
static int looped = 0;
|
||||
/* We've hit the end of the old volume. Close it and open the next one */
|
||||
/* Values for type: 0: writing 1: reading 2: updating */
|
||||
int
|
||||
new_volume (type)
|
||||
int type;
|
||||
{
|
||||
int c;
|
||||
char inbuf[80];
|
||||
char *p;
|
||||
static FILE *read_file = 0;
|
||||
extern int now_verifying;
|
||||
extern char TTY_NAME[];
|
||||
static int looped = 0;
|
||||
|
||||
if (!read_file && !f_run_script_at_end)
|
||||
read_file = (archive == 0) ? fopen (TTY_NAME, "r") : stdin;
|
||||
if (!read_file && !f_run_script_at_end)
|
||||
read_file = (archive == 0) ? fopen (TTY_NAME, "r") : stdin;
|
||||
|
||||
if (now_verifying)
|
||||
return -1;
|
||||
if (f_verify)
|
||||
verify_volume ();
|
||||
if ((c = rmtclose (archive)) < 0)
|
||||
msg_perror ("Warning: can't close %s(%d,%d)", ar_files[cur_ar_file], archive, c);
|
||||
if (now_verifying)
|
||||
return -1;
|
||||
if (f_verify)
|
||||
verify_volume ();
|
||||
if ((c = rmtclose (archive)) < 0)
|
||||
msg_perror ("Warning: can't close %s(%d,%d)", ar_files[cur_ar_file], archive, c);
|
||||
|
||||
global_volno++;
|
||||
volno++;
|
||||
cur_ar_file++;
|
||||
if (cur_ar_file == n_ar_files)
|
||||
{
|
||||
cur_ar_file = 0;
|
||||
looped = 1;
|
||||
}
|
||||
global_volno++;
|
||||
volno++;
|
||||
cur_ar_file++;
|
||||
if (cur_ar_file == n_ar_files)
|
||||
{
|
||||
cur_ar_file = 0;
|
||||
looped = 1;
|
||||
}
|
||||
|
||||
tryagain:
|
||||
if (looped)
|
||||
{
|
||||
/* We have to prompt from now on. */
|
||||
if (f_run_script_at_end)
|
||||
system (info_script);
|
||||
else
|
||||
for (;;)
|
||||
{
|
||||
fprintf (msg_file, "\007Prepare volume #%d for %s and hit return: ", global_volno, ar_files[cur_ar_file]);
|
||||
fflush (msg_file);
|
||||
if (fgets (inbuf, sizeof (inbuf), read_file) == 0)
|
||||
tryagain:
|
||||
if (looped)
|
||||
{
|
||||
/* We have to prompt from now on. */
|
||||
if (f_run_script_at_end)
|
||||
system (info_script);
|
||||
else
|
||||
for (;;)
|
||||
{
|
||||
fprintf (msg_file, "\007Prepare volume #%d for %s and hit return: ", global_volno, ar_files[cur_ar_file]);
|
||||
fflush (msg_file);
|
||||
if (fgets (inbuf, sizeof (inbuf), read_file) == 0)
|
||||
{
|
||||
fprintf (msg_file, "EOF? What does that mean?");
|
||||
if (cmd_mode != CMD_EXTRACT && cmd_mode != CMD_LIST && cmd_mode != CMD_DIFF)
|
||||
msg ("Warning: Archive is INCOMPLETE!");
|
||||
exit (EX_BADARCH);
|
||||
}
|
||||
if (inbuf[0] == '\n' || inbuf[0] == 'y' || inbuf[0] == 'Y')
|
||||
break;
|
||||
|
||||
switch (inbuf[0])
|
||||
{
|
||||
case '?':
|
||||
{
|
||||
fprintf (msg_file, "EOF? What does that mean?");
|
||||
if (cmd_mode != CMD_EXTRACT && cmd_mode != CMD_LIST && cmd_mode != CMD_DIFF)
|
||||
msg ("Warning: Archive is INCOMPLETE!");
|
||||
exit (EX_BADARCH);
|
||||
}
|
||||
if (inbuf[0] == '\n' || inbuf[0] == 'y' || inbuf[0] == 'Y')
|
||||
break;
|
||||
|
||||
switch (inbuf[0])
|
||||
{
|
||||
case '?':
|
||||
{
|
||||
fprintf (msg_file, "\
|
||||
fprintf (msg_file, "\
|
||||
n [name] Give a new filename for the next (and subsequent) volume(s)\n\
|
||||
q Abort tar\n\
|
||||
! Spawn a subshell\n\
|
||||
? Print this list\n");
|
||||
}
|
||||
break;
|
||||
|
||||
case 'q': /* Quit */
|
||||
fprintf (msg_file, "No new volume; exiting.\n");
|
||||
if (cmd_mode != CMD_EXTRACT && cmd_mode != CMD_LIST && cmd_mode != CMD_DIFF)
|
||||
msg ("Warning: Archive is INCOMPLETE!");
|
||||
exit (EX_BADARCH);
|
||||
|
||||
case 'n': /* Get new file name */
|
||||
{
|
||||
char *q, *r;
|
||||
static char *old_name;
|
||||
|
||||
for (q = &inbuf[1]; *q == ' ' || *q == '\t'; q++)
|
||||
;
|
||||
for (r = q; *r; r++)
|
||||
if (*r == '\n')
|
||||
*r = '\0';
|
||||
old_name = p = (char *) malloc ((unsigned) (strlen (q) + 2));
|
||||
if (p == 0)
|
||||
{
|
||||
msg ("Can't allocate memory for name");
|
||||
exit (EX_SYSTEM);
|
||||
}
|
||||
(void) strcpy (p, q);
|
||||
ar_files[cur_ar_file] = p;
|
||||
}
|
||||
break;
|
||||
|
||||
case '!':
|
||||
#ifdef __MSDOS__
|
||||
spawnl (P_WAIT, getenv ("COMSPEC"), "-", 0);
|
||||
#else
|
||||
/* JF this needs work! */
|
||||
switch (fork ())
|
||||
{
|
||||
case -1:
|
||||
msg_perror ("can't fork!");
|
||||
break;
|
||||
case 0:
|
||||
p = getenv ("SHELL");
|
||||
if (p == 0)
|
||||
p = "/bin/sh";
|
||||
execlp (p, "-sh", "-i", 0);
|
||||
msg_perror ("can't exec a shell %s", p);
|
||||
_exit (55);
|
||||
default:
|
||||
wait (0);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 'q': /* Quit */
|
||||
fprintf (msg_file, "No new volume; exiting.\n");
|
||||
if (cmd_mode != CMD_EXTRACT && cmd_mode != CMD_LIST && cmd_mode != CMD_DIFF)
|
||||
msg ("Warning: Archive is INCOMPLETE!");
|
||||
exit (EX_BADARCH);
|
||||
|
||||
if (type == 2 || f_verify)
|
||||
archive = rmtopen (ar_files[cur_ar_file], O_RDWR | O_CREAT, 0666);
|
||||
else if (type == 1)
|
||||
archive = rmtopen (ar_files[cur_ar_file], O_RDONLY, 0666);
|
||||
else if (type == 0)
|
||||
archive = rmtcreat (ar_files[cur_ar_file], 0666);
|
||||
else
|
||||
archive = -1;
|
||||
case 'n': /* Get new file name */
|
||||
{
|
||||
char *q, *r;
|
||||
static char *old_name;
|
||||
|
||||
if (archive < 0)
|
||||
{
|
||||
msg_perror ("can't open %s", ar_files[cur_ar_file]);
|
||||
goto tryagain;
|
||||
}
|
||||
for (q = &inbuf[1]; *q == ' ' || *q == '\t'; q++)
|
||||
;
|
||||
for (r = q; *r; r++)
|
||||
if (*r == '\n')
|
||||
*r = '\0';
|
||||
old_name = p = (char *) malloc ((unsigned) (strlen (q) + 2));
|
||||
if (p == 0)
|
||||
{
|
||||
msg ("Can't allocate memory for name");
|
||||
exit (EX_SYSTEM);
|
||||
}
|
||||
(void) strcpy (p, q);
|
||||
ar_files[cur_ar_file] = p;
|
||||
}
|
||||
break;
|
||||
|
||||
case '!':
|
||||
#ifdef __MSDOS__
|
||||
setmode (archive, O_BINARY);
|
||||
spawnl (P_WAIT, getenv ("COMSPEC"), "-", 0);
|
||||
#else
|
||||
/* JF this needs work! */
|
||||
switch (fork ())
|
||||
{
|
||||
case -1:
|
||||
msg_perror ("can't fork!");
|
||||
break;
|
||||
case 0:
|
||||
p = getenv ("SHELL");
|
||||
if (p == 0)
|
||||
p = "/bin/sh";
|
||||
execlp (p, "-sh", "-i", 0);
|
||||
msg_perror ("can't exec a shell %s", p);
|
||||
_exit (55);
|
||||
default:
|
||||
wait (0);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* this is a useless function that takes a buffer returned by wantbytes
|
||||
|
||||
if (type == 2 || f_verify)
|
||||
archive = rmtopen (ar_files[cur_ar_file], O_RDWR | O_CREAT, 0666);
|
||||
else if (type == 1)
|
||||
archive = rmtopen (ar_files[cur_ar_file], O_RDONLY, 0666);
|
||||
else if (type == 0)
|
||||
archive = rmtcreat (ar_files[cur_ar_file], 0666);
|
||||
else
|
||||
archive = -1;
|
||||
|
||||
if (archive < 0)
|
||||
{
|
||||
msg_perror ("can't open %s", ar_files[cur_ar_file]);
|
||||
goto tryagain;
|
||||
}
|
||||
#ifdef __MSDOS__
|
||||
setmode (archive, O_BINARY);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* this is a useless function that takes a buffer returned by wantbytes
|
||||
and does nothing with it. If the function called by wantbytes returns
|
||||
an error indicator (non-zero), this function is called for the rest of
|
||||
the file.
|
||||
*/
|
||||
int
|
||||
no_op (size, data)
|
||||
int size;
|
||||
char *data;
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
int
|
||||
no_op (size, data)
|
||||
int size;
|
||||
char *data;
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Some other routine wants SIZE bytes in the archive. For each chunk of
|
||||
/* Some other routine wants SIZE bytes in the archive. For each chunk of
|
||||
the archive, call FUNC with the size of the chunk, and the address of
|
||||
the chunk it can work with.
|
||||
*/
|
||||
int
|
||||
wantbytes (size, func)
|
||||
long size;
|
||||
int (*func) ();
|
||||
{
|
||||
char *data;
|
||||
long data_size;
|
||||
int
|
||||
wantbytes (size, func)
|
||||
long size;
|
||||
int (*func) ();
|
||||
{
|
||||
char *data;
|
||||
long data_size;
|
||||
|
||||
while (size)
|
||||
{
|
||||
data = findrec ()->charptr;
|
||||
if (data == NULL)
|
||||
{ /* Check it... */
|
||||
msg ("Unexpected EOF on archive file");
|
||||
return -1;
|
||||
}
|
||||
data_size = endofrecs ()->charptr - data;
|
||||
if (data_size > size)
|
||||
data_size = size;
|
||||
if ((*func) (data_size, data))
|
||||
func = no_op;
|
||||
userec ((union record *) (data + data_size - 1));
|
||||
size -= data_size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
while (size)
|
||||
{
|
||||
data = findrec ()->charptr;
|
||||
if (data == NULL)
|
||||
{ /* Check it... */
|
||||
msg ("Unexpected EOF on archive file");
|
||||
return -1;
|
||||
}
|
||||
data_size = endofrecs ()->charptr - data;
|
||||
if (data_size > size)
|
||||
data_size = size;
|
||||
if ((*func) (data_size, data))
|
||||
func = no_op;
|
||||
userec ((union record *) (data + data_size - 1));
|
||||
size -= data_size;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user