--- cci/usr/src/bin/tar.c 2019/07/28 12:24:19 1.1.1.1 +++ cci/usr/src/bin/tar.c 2019/07/28 12:27:19 1.1.1.2 @@ -89,7 +89,6 @@ char *strcat(); char *rindex(); char *getcwd(); char *getwd(); - main(argc, argv) int argc; char *argv[]; @@ -100,7 +99,7 @@ char *argv[]; usage(); tfile = NULL; - usefile = magtape; + usefile = magtape; argv[argc] = 0; argv++; for (cp = *argv++; *cp; cp++) @@ -112,7 +111,23 @@ char *argv[]; "tar: tapefile must be specified with 'f' option\n"); usage(); } - usefile = *argv++; +#ifdef RTAR + { char *host; + + host = *argv++; + usefile = rindex(host, ':'); + if (usefile == 0) + usefile = magtape; + else + *usefile++ = '\0'; + if (rmthost(host) == 0) + done(1); + /* no longer need or want root privileges */ + setuid(getuid()); + } +#else + usefile = *argv++; +#endif RTAR fflag++; break; @@ -216,7 +231,13 @@ char *argv[]; fprintf(stderr, "tar: %c: unknown option\n", *cp); usage(); } - +#ifdef RTAR + if (!fflag) { + fprintf(stderr, + "rtar: remote host name must be specified with 'f' option\n"); + usage(); + } +#endif RTAR if (!rflag && !xflag && !tflag) usage(); tbuf = (union hblock *)malloc(nblock*TBLOCK); @@ -238,6 +259,23 @@ char *argv[]; if (signal(SIGTERM, SIG_IGN) != SIG_IGN) signal(SIGTERM, onterm); #endif + +#ifdef RTAR + if (rmtopen(usefile, 2) < 0) { + if (cflag == 0 || (rmtcreat(usefile, 0666)) < 0) { + fprintf(stderr, + "tar: cannot open %s\n", usefile); + done(1); + } + } + dorep(argv); + done(0); + } + if (rmtopen(usefile, 0) < 0) { + fprintf(stderr, "tar: cannot open %s\n", usefile); + done(1); + } +#else if (strcmp(usefile, "-") == 0) { if (cflag == 0) { fprintf(stderr, @@ -263,17 +301,23 @@ char *argv[]; fprintf(stderr, "tar: cannot open %s\n", usefile); done(1); } +#endif RTAR if (xflag) doxtract(argv); else dotable(); + bread(mt, tbuf, TBLOCK*nblock); done(0); } usage() { fprintf(stderr, +#ifdef RTAR +"rtar: usage: rtar -f{txru}[cvblmhopwBi] remotehost:[tapefile] [blocksize] file1 file2...\n"); +#else "tar: usage: tar -{txru}[cvfblmhopwBi] [tapefile] [blocksize] file1 file2...\n"); +#endif RTAR done(1); } @@ -291,7 +335,7 @@ dorep(argv) done(0); getdir(); } while (!endtape()); - backtape(); + backtape(); if (tfile != NULL) { char buf[200]; @@ -307,7 +351,7 @@ dorep(argv) } (void) getcwd(wdir); - while (*argv && ! term) { + while (*argv && !term) { cp2 = *argv; if (!strcmp(cp2, "-C") && argv[1]) { argv++; @@ -348,7 +392,6 @@ dorep(argv) } } putempty(); - putempty(); flushtape(); if (linkerrok == 0) return; @@ -593,6 +636,8 @@ putfile(longname, shortname, parent) writetape(dblock.dummy); while ((i = read(infile, buf, TBLOCK)) > 0 && blocks > 0) { + while (i < TBLOCK) + buf[i++] = '\0'; writetape(buf); blocks--; } @@ -1078,10 +1123,12 @@ readtape(buffer) fprintf(stderr, "tar: tape read error\n"); done(3); } + if (first == 0) { - if ((i % TBLOCK) != 0) { - fprintf(stderr, "tar: tape blocksize error\n"); - done(3); + if (((i % TBLOCK) != 0) || (i == 0)){ + fprintf(stderr, "tar: tape blocksize error. "); + fprintf(stderr, "Block size = %d bytes.\n", i); + done(3); } i /= TBLOCK; if (i != nblock) { @@ -1099,17 +1146,13 @@ readtape(buffer) writetape(buffer) char *buffer; { - first = 1; - if (recno >= nblock) { - if (write(mt, tbuf[0].dummy, TBLOCK*nblock) < 0) { - fprintf(stderr, "tar: tape write error\n"); - done(2); - } - recno = 0; - } bcopy(buffer, tbuf[recno++].dummy, TBLOCK); if (recno >= nblock) { +#ifdef RTAR + if (rmtwrite(tbuf[0].dummy, TBLOCK*nblock) < 0) { +#else if (write(mt, tbuf[0].dummy, TBLOCK*nblock) < 0) { +#endif RTAR fprintf(stderr, "tar: tape write error\n"); done(2); } @@ -1117,6 +1160,25 @@ writetape(buffer) } return (TBLOCK); } +#ifdef RTAR +backtape() +{ + static int mtdev = 1; + static struct mtget *mtget; + + if (mtdev == 1) { + mtget = (struct mtget *)rmtstatus(mtdev); + } + if (mtget != (struct mtget *)0) { /* if never been an error */ + if (rmtioctl(MTBSR, 1) < 0) { + fprintf(stderr, "tar: tape backspace error\n"); + done(4); + } + } else + rmtseek((long) -TBLOCK*nblock, 1); + recno--; +} +#else backtape() { @@ -1136,9 +1198,14 @@ backtape() recno--; } +#endif RTAR + flushtape() { - write(mt, tbuf[0].dummy, TBLOCK*nblock); + register int record = recno; + + while ((record != 0) && (record++ < nblock)) + putempty(); } bread(fd, buf, size) @@ -1150,14 +1217,23 @@ bread(fd, buf, size) static int lastread = 0; if (!Bflag) +#ifdef RTAR + return (rmtread(buf, size)); +#else return (read(fd, buf, size)); +#endif RTAR for (count = 0; count < size; count += lastread) { if (lastread < 0) { if (count > 0) return (count); return (lastread); } +#ifdef RTAR + lastread = rmtread(buf, size - count); +#else lastread = read(fd, buf, size - count); + printf("lastread: %d ", lastread); +#endif RTAR buf += lastread; } return (count);