|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 6386 (0x18f2) Types: TextFile Names: »shar.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/shar/shar.c«
/* ** SHAR ** Make a shell archive of a list of files. ** ** Options: ** -b Strip leading directories off names before packing ** -n # Set number of this archive in a series ** -o foo Output goes to file foo, not stdout ** -e # Set ending archive number of series ** -t "See README" Set instructions for when all archives are done */ #include "shar.h" RCS("$Header: shar.c,v 1.18 87/03/18 14:10:21 rs Exp $") /* ** This prolog is output before the archive. */ static char *Prolog[] = { "! /bin/sh", " This is a shell archive. Remove anything before this line, then unpack", " it by saving it into a file and typing \"sh file\". To overwrite existing", " files, type \"sh file -c\". You can also feed this as standard input via", " unshar, or by typing \"sh <file\", e.g.. If this archive is complete, you", " will see the following message at the end:", NULL }; /* ** Package up one file or directory. */ static void shar(file, Basename) char *file; int Basename; { register char *s; register char *Name; register int Bads; register int Lastchar; register off_t Size; char buf[BUFSIZ]; /* Just in case. */ if (EQ(file, ".") || EQ(file, "..")) return; Size = Fsize(file); Name = Basename && (Name = RDX(file, '/')) ? Name + 1 : file; /* Making a directory? */ if (Ftype(file) == F_DIR) { printf("if test ! -d %s ; then\n", Name); printf(" echo shar: Creating directory \\\"%s\\\"\n", Name); printf(" mkdir %s\n", Name); printf("fi\n"); } else { if (freopen(file, "r", stdin) == NULL) { fprintf(stderr, "Can't open %s, %s\n", file, Ermsg(errno)); exit(1); } /* Emit the per-file prolog. */ printf("if test -f %s -a \"${1}\" != \"-c\" ; then \n", Name); printf(" echo shar: Will not over-write existing file \\\"%s\\\"\n", Name); printf("else\n"); printf("echo shar: Extracting \\\"%s\\\" \\(%ld character%s\\)\n", Name, (long)Size, Size > 1 ? "s" : ""); printf("sed \"s/^X//\" >%s <<'END_OF_%s'\n", Name, Name); /* Output the file contents. */ for (Bads = 0, Lastchar = '\n'; fgets(buf, BUFSIZ, stdin); ) { printf("X"); if (buf[0]) { for (s = buf; *s; s++) { if (BADCHAR(*s)) Bads++; (void)putchar(*s); } Lastchar = s[-1]; } else Lastchar = 'X'; } /* Tell about missing \n and control characters. */ if (Lastchar != '\n') (void)putchar('\n'); printf("END_OF_%s\n", Name); if (Lastchar != '\n') { printf("echo shar: Missing newline added to \\\"%s\\\"\n", Name); fprintf(stderr, "Missing newline added to \"%s\"\n", Name); } if (Bads) { printf( "echo shar: %d control character%s may be missing from \\\"%s\\\"\n", Bads, Bads > 1 ? "s" : "", Name); fprintf(stderr, "Found %d control char%s in \"%s\"\n", Bads, Bads > 1 ? "s" : "", Name); } /* Output size check. */ printf("if test %ld -ne `wc -c <%s`; then\n", (long)Size, Name); printf(" echo shar: \\\"%s\\\" unpacked with wrong size!\n", Name); printf("fi\n"); /* Executable? */ if (Fexecute(file)) printf("chmod +x %s\n", Name); printf("# end of overwriting check\nfi\n"); } } main(ac, av) int ac; register char *av[]; { register char *Trailer; register char *p; register int i; register int length; register int Oops; register int Knum; register int Kmax; time_t clock; int Basename; /* Parse JCL. */ Basename = 0; Knum = 0; Kmax = 0; Trailer = NULL; for (Oops = 0; (i = getopt(ac, av, "be:n:o:t:")) != EOF; ) switch (i) { default: Oops++; break; case 'b': Basename++; break; case 'e': Kmax = atoi(optarg); break; case 'n': Knum = atoi(optarg); break; case 'o': if (freopen(optarg, "w", stdout) == NULL) { fprintf(stderr, "Can't open %s for output, %s.\n", optarg, Ermsg(errno)); Oops++; } break; case 't': Trailer = optarg; break; } av += optind; if (*av == NULL) { fprintf(stderr, "No input files\n"); Oops++; } if (Oops) { fprintf(stderr, "USAGE: shar [-b] [-o:] [-n:e:t:] file... >SHAR\n"); exit(1); } /* Everything readable and reasonably-named? */ for (Oops = 0, i = 0; p = av[i]; i++) if (freopen(p, "r", stdin) == NULL) { fprintf(stderr, "Can't read %s, %s.\n", p, Ermsg(errno)); Oops++; } else for (; *p; p++) if (!isascii(*p) || (!isalnum(*p) && IDX(OK_CHARS, *p) == NULL)) { fprintf(stderr, "Bad character '%c' in '%s'.\n", *p, av[i]); Oops++; } if (Oops) exit(2); /* Prolog. */ for (i = 0; p = Prolog[i]; i++) printf("#%s\n", p); if (Knum && Kmax) printf("#\t\t\"End of archive %d (of %d).\"\n", Knum, Kmax); else printf("#\t\t\"End of shell archive.\"\n"); printf("# Contents: "); for (length = 12, i = 0; p = av[i++]; length += strlen(p) + 1) if (length + strlen(p) + 1 < WIDTH) printf(" %s", p); else { printf("\n# %s", p); length = 4; } printf("\n"); clock = time((time_t *)NULL); printf("# Wrapped by %s@%s on %s", User(), Host(), ctime(&clock)); printf("PATH=/bin:/usr/bin:/usr/ucb ; export PATH\n"); /* Do it. */ while (*av) shar(*av++, Basename); /* Epilog. */ if (Knum && Kmax) { printf("echo shar: End of archive %d \\(of %d\\).\n", Knum, Kmax); printf("cp /dev/null ark%disdone\n", Knum); printf("MISSING=\"\"\n"); printf("for I in"); for (i = 0; i < Kmax; i++) printf(" %d", i + 1); printf(" ; do\n"); printf(" if test ! -f ark${I}isdone ; then\n"); printf("\tMISSING=\"${MISSING} ${I}\"\n"); printf(" fi\n"); printf("done\n"); printf("if test \"${MISSING}\" = \"\" ; then\n"); if (Kmax == 2) printf(" echo You have unpacked both archives.\n"); else printf(" echo You have unpacked all %d archives.\n", Kmax); if (Trailer && *Trailer) printf(" echo \"%s\"\n", Trailer); printf(" rm -f ark[1-9]isdone%s\n", Kmax >= 9 ? " ark[1-9][0-9]isdone" : ""); printf("else\n"); printf(" echo You still need to unpack the following archives:\n"); printf(" echo \" \" ${MISSING}\n"); printf("fi\n"); printf("## End of shell archive.\n"); } else printf("echo shar: End of shell archive.\n"); printf("exit 0\n"); exit(0); }