home *** CD-ROM | disk | FTP | other *** search
- /*
- * hold terminate a pipe, gather stdin into a temporary,
- * then rename the temporary to the argument's name.
- *
- * Example: ... | hold filename
- * or: ... | hold > filename
- *
- */
-
- #ifdef MSDOS
- #include <io.h>
- #endif
-
- #include <stdio.h>
- #include <errno.h>
- #ifndef MSDOS
- #include <signal.h>
- #endif
- FILE *fp = NULL;
- int stdoutf;
-
- #ifdef MSDOS
- char fname[11] = "holdXXXXXX";
- #endif
- #ifdef M_XENIX
- char fname[11] = "holdXXXXXX";
- #else
- char fname[20] = "/usr/tmp/holdXXXXXX";
- #endif
-
-
- extern int errno; /* Declare global error value. */
-
- #ifndef MSDOS
- /* This routine gains control when a signal is trapped. It unlinks the
- * temporary file. This is necessary when a pipe gets broken.
- */
- int Trap()
- {
- unlink(fname); /* Ignore errors at this point, we are dead anyway. */
- exit(1);
- }
- #endif
-
- int main(argc, argv)
- int argc;
- char *argv[];
- {
- int c;
-
- stdoutf = 0;
- if (argc > 1)
- stdoutf = 1;
-
- if (argc > 2) {
- fprintf(stderr, "Usage: ... | hold filename\n");
- fprintf(stderr, " or ... | hold > filename\n");
- return(1);
- }
- #ifndef MSDOS
- /* Trap signals to remove file on. */
- signal(SIGHUP, Trap);
- signal(SIGINT, Trap);
- signal(SIGQUIT, Trap);
- signal(SIGTERM, Trap);
- #endif
- if ((fp = fopen(mktemp(fname), "w")) == NULL)
- errclean(2, "open %s", fname, 0);
-
- while ((c = getchar()) != EOF)
- fputc(c, fp);
-
- if (ferror(stdin) || ferror(fp))
- errclean(3, "copy stdin to %s", 0, fname);
-
- if (fclose(fp) != 0)
- errclean(4, "close %s", fname, 0);
-
- if (stdoutf) {
- if (rename(fname, argv[1]) != 0)
- errclean(5, "rename %s to %s", fname, argv[1]);
- }
- else {
- if ((fp = fopen(fname, "r")) == NULL)
- errclean(6, "open %s", fname, 0);
-
- while ((c = getc(fp)) != EOF)
- fputc(c, stdout);
-
- if (ferror(stdout) || ferror(fp))
- errclean(7, "copy %s to stdout", 0, fname);
-
- if (fclose(fp) != 0)
- errclean(8, "close %s", fname, 0);
-
- if (unlink(fname) != 0)
- errclean(9, "remove %s", fname, 0);
- }
-
- return(0);
- }
-
-
- #ifndef MSDOS
- int rename(s1, s2) /* s2 = new name, s1 = existing name */
- char *s1, *s2;
- {
- /* assure that new name doesn't exist */
- if (unlink(s2) != 0 && errno != ENOENT) {
- errclean(10, "remove %s", s2, 0);
- return(1);
- }
- /* connect new name to existing file */
- if (link(s1, s2) != 0) {
- errclean(11, "link %s to %s", s1, s2);
- return(1);
- }
- /* remove old name for the file */
- if (unlink(s1) != 0) {
- errclean(12, "remove %s", s1, 0);
- return(1);
- }
- return(0);
- }
- #endif
-
- /*
- * errclean - output error message and exit to system
- */
- errclean(code, string, arg1, arg2)
- int code;
- char *string;
- char *arg1, *arg2;
- {
- char lstr[80];
-
- if (fp != NULL) {
- (void)unlink(fname);
- fp = NULL;
- }
- sprintf(lstr, "hold %2d: can't %s\n", code, string);
- fprintf(stderr, lstr, arg1, arg2);
- exit(code);
- }
-
-