* Buffer management for tar.
*
* Written by John Gilmore, ihnp4!hoptoad!gnu, on 25 August 1985.
+ *
+ * @(#) buffer.c 1.28 11/6/87 - gnu
*/
#include <stdio.h>
#include <errno.h>
-#ifndef STDC_HEADERS
-extern int errno;
-#endif
#include <sys/types.h> /* For non-Berkeley systems */
+#include <sys/stat.h>
#include <signal.h>
-#include <time.h>
-time_t time();
-#ifndef NO_MTIO
+#ifndef MSDOS
#include <sys/ioctl.h>
+#if !defined(USG) || defined(HAVE_MTIO)
#include <sys/mtio.h>
#endif
-
-#ifdef BSD42
-#include <sys/file.h>
-#else
-#ifndef V7
-#include <fcntl.h>
-#endif
#endif
-#ifdef __MSDOS__
+#ifdef MSDOS
+# include <fcntl.h>
#include <process.h>
+#else
+# ifdef XENIX
+# include <sys/inode.h>
+# endif
+# include <sys/file.h>
#endif
-#ifdef XENIX
-#include <sys/inode.h>
-#endif
+extern int errno;
#include "tar.h"
#include "port.h"
#define PREAD 0 /* Read file descriptor from pipe() */
#define PWRITE 1 /* Write file descriptor from pipe() */
+#ifdef __STDC__
+extern void *malloc();
+extern void *valloc();
+#else
+extern char *malloc();
+extern char *valloc();
+#endif
+extern time_t time();
+
+extern char *index(), *strcat();
+extern char *strcpy();
+
+/*
+ * V7 doesn't have a #define for this.
+ */
+#ifndef O_RDONLY
+#define O_RDONLY 0
+#endif
+#ifndef O_RDWR
+#define O_RDWR 2
+#endif
+#ifndef O_CREAT
+#define O_CREAT 0
+#endif
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
#define MAGIC_STAT 105 /* Magic status returned by child, if
it can't exec. We hope compress/sh
never return this status! */
-char *valloc();
-
void writeerror();
void readerror();
void ck_pipe();
void ck_close();
-int backspace_output();
extern void finish_header();
-void flush_archive();
-int isfile();
-int new_volume();
-void verify_volume();
extern void to_oct();
#ifndef __MSDOS__
/*
* Have we hit EOF yet?
*/
-static int hit_eof;
+static int eof;
/* JF we're reading, but we just read the last record and its time to update */
extern time_to_start_writing;
void
reset_eof()
{
- if(hit_eof) {
- hit_eof=0;
+ if(eof) {
+ eof=0;
ar_record=ar_block;
ar_last=ar_block+blocking;
ar_reading=0;
findrec()
{
if (ar_record == ar_last) {
- if (hit_eof)
+ if (eof)
return (union record *)NULL; /* EOF */
flush_archive();
if (ar_record == ar_last) {
- hit_eof++;
+ eof++;
return (union record *)NULL; /* EOF */
}
}
}
}
-#ifdef __MSDOS__
+#ifdef MSDOS
void
child_open()
{
- fprintf(stderr,"MS-DOS %s can't use compressed or remote archives\n",tar);
+ fprintf(stderr,"MSDOS %s can't use compressed or remote archives\n",tar);
exit(EX_ARGSBAD);
}
#else
/* return non-zero if p is the name of a directory */
-int
isfile(p)
char *p;
{
if(stat(p,&stbuf)<0)
return 1;
- if(S_ISREG(stbuf.st_mode))
+ if((stbuf.st_mode&S_IFMT)==S_IFREG)
return 1;
return 0;
}
* reading or writing.
*/
/* JF if the arg is 2, open for reading and writing. */
-void
open_archive(reading)
int reading;
{
} else {
archive = rmtcreat(ar_file, 0666);
}
- if (archive < 0) {
- msg_perror("can't open %s",ar_file);
- exit(EX_BADARCH);
- }
#ifndef __MSDOS__
if(!_isrmt(archive)) {
struct stat tmp_stat;
fstat(archive,&tmp_stat);
- if(S_ISREG(tmp_stat.st_mode)) {
+ if((tmp_stat.st_mode&S_IFMT)==S_IFREG) {
ar_dev=tmp_stat.st_dev;
ar_ino=tmp_stat.st_ino;
}
}
#endif
-#ifdef __MSDOS__
+ if (archive < 0) {
+ msg_perror("can't open %s",ar_file);
+ exit(EX_BADARCH);
+ }
+#ifdef MSDOS
setmode(archive, O_BINARY);
#endif
* adding (baserec+ar_record), doing a 9-bit shift of baserec, then
* subtracting ar_block from that, shifting it back, losing the top 9 bits.
*/
-void
saverec(pointer)
union record **pointer;
{
}
*/
-void
fl_write()
{
int err;
real_s_sizeleft = 0;
return;
}
-#ifdef __MSDOS__
+#ifdef MSDOS
if(save_name[1]==':')
save_name+=2;
#endif
else if((real_s_sizeleft+RECORDSIZE-1)/RECORDSIZE<=copy_back)
real_s_name[0] = '\0';
else {
-#ifdef __MSDOS__
+#ifdef MSDOS
if(save_name[1]==':')
save_name+=2;
#endif
/*
* Perform a read to flush the buffer.
*/
-void
fl_read()
{
int err; /* Result from system call */
if(f_multivol) {
if(save_name) {
if(save_name!=real_s_name) {
-#ifdef __MSDOS__
+#ifdef MSDOS
if(save_name[1]==':')
save_name+=2;
#endif
/*
* Flush the current buffer to/from the archive.
*/
-void
flush_archive()
{
int c;
/* Backspace the archive descriptor by one blocks worth.
If its a tape, MTIOCTOP will work. If its something else,
we try to seek on it. If we can't seek, we lose! */
-int
backspace_output()
{
long cur;
/*
* Close the archive file.
*/
-void
close_archive()
{
int child;
if (time_to_start_writing || !ar_reading)
flush_archive();
if(cmd_mode==CMD_DELETE) {
- off_t pos;
+ long pos;
pos = rmtlseek(archive,0L,1);
-#ifndef __MSDOS__
- (void) ftruncate(archive,pos);
+#ifndef MSDOS
+ /* FIXME does ftruncate really take an INT?! */
+ (void) ftruncate(archive,(int)pos);
#else
(void)rmtwrite(archive,"",0);
#endif
if((c=rmtclose(archive))<0)
msg_perror("Warning: can't close %s(%d,%d)",ar_file,archive,c);
-#ifndef __MSDOS__
+#ifndef MSDOS
if (childpid) {
/*
* Loop waiting for the right child to die, or for
;
if (child != -1) {
- switch (WTERMSIG(status)) {
+ switch (TERM_SIGNAL(status)) {
case 0:
/* Child voluntarily terminated -- but why? */
- if (WEXITSTATUS(status) == MAGIC_STAT) {
+ if (TERM_VALUE(status) == MAGIC_STAT) {
exit(EX_SYSTEM);/* Child had trouble */
}
- if (WEXITSTATUS(status) == (SIGPIPE + 128)) {
+ if (TERM_VALUE(status) == (SIGPIPE + 128)) {
/*
* /bin/sh returns this if its child
* dies with SIGPIPE. 'Sok.
*/
break;
- } else if (WEXITSTATUS(status))
+ } else if (TERM_VALUE(status))
msg("child returned status %d",
- WEXITSTATUS(status));
+ TERM_VALUE(status));
case SIGPIPE:
break; /* This is OK. */
default:
msg("child died with signal %d%s",
- WTERMSIG(status),
- WIFCOREDUMPED(status)? " (core dumped)": "");
+ TERM_SIGNAL(status),
+ TERM_COREDUMP(status)? " (core dumped)": "");
}
}
}
-#endif /* __MSDOS__ */
+#endif /* MSDOS */
}
/* 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;
{
break;
case '!':
-#ifdef __MSDOS__
+#ifdef MSDOS
spawnl(P_WAIT,getenv("COMSPEC"),"-",0);
#else
/* JF this needs work! */
msg_perror("can't open %s",ar_file);
goto tryagain;
}
-#ifdef __MSDOS__
+#ifdef MSDOS
setmode(archive,O_BINARY);
#endif
return 0;