|
|
1.1 ! root 1: /* ! 2: * Make a process immmune to quit and hup signals. ! 3: * Vlad 2-12-92 ! 4: */ ! 5: #include <stdio.h> ! 6: #include <signal.h> ! 7: #include <string.h> ! 8: #include <ctype.h> ! 9: #include <access.h> ! 10: ! 11: char *flatten(); /* Convert array of strings to a string */ ! 12: ! 13: char *name; ! 14: ! 15: main(argc, argv) ! 16: int argc; ! 17: char **argv; ! 18: { ! 19: if (argc < 2) { ! 20: fprintf(stderr, "usage: nohup command arg...\n"); ! 21: exit(1); ! 22: } ! 23: immune(); /* Make immunity */ ! 24: checkredirect();/* Check and redirect if necessary stdout and stderr */ ! 25: execvp(argv[1], argv + 1); /* Execute command */ ! 26: /* We should never come here */ ! 27: fatal("%s: No such file or directory", flatten(&argv[1])); ! 28: } ! 29: ! 30: /* ! 31: * Ignore hup and quit signals ! 32: */ ! 33: immune() ! 34: { ! 35: signal(SIGHUP, SIG_IGN); ! 36: signal(SIGQUIT, SIG_IGN); ! 37: } ! 38: ! 39: /* ! 40: * If stdout and/or stderr is a tty. If it is so then redirect ! 41: * stdout and/or stderr to "outfile". ! 42: */ ! 43: checkredirect() ! 44: { ! 45: char *outname(); /* Find the name of the output file */ ! 46: char *outfile; /* Name of the output file */ ! 47: ! 48: ! 49: if (isatty(1)) { ! 50: outfile = outname(); /* Find output file name */ ! 51: fprintf(stderr, "Sending output to %s\n", outfile); ! 52: redirect(stdout, outfile); ! 53: if (isatty(2)) ! 54: redirect(stderr, outfile); ! 55: } else ! 56: if (isatty(2)) { ! 57: outfile = outname(); /* Find output file name */ ! 58: redirect(stderr, outfile); ! 59: } ! 60: } ! 61: ! 62: /* ! 63: * Redirect fp to output file. ! 64: */ ! 65: redirect(fp, name) ! 66: FILE *fp; /* Pointer to a file that should be redirected */ ! 67: char *name; /* File name */ ! 68: { ! 69: if (freopen(name, "a", fp) == NULL) ! 70: fatal("cannot open output file"); ! 71: } ! 72: ! 73: /* ! 74: * Function flatten() concatinates an array of the strings to a string, ! 75: * where the input strings are separated by spaces. ! 76: */ ! 77: #define BUF_SIZE 80 /* Size of the buffer to be alloc */ ! 78: ! 79: char *flatten(argv) ! 80: char *argv[]; ! 81: { ! 82: extern char *malloc(), ! 83: *realloc(); ! 84: char *buf; /* Buffer for output string */ ! 85: unsigned count = BUF_SIZE; /* Size of the buffer */ ! 86: unsigned len; /* Current length used */ ! 87: unsigned i; /* Length of new addition */ ! 88: ! 89: buf = malloc(BUF_SIZE); ! 90: *buf = '\0'; ! 91: len = 1; /* We always need a terminator */ ! 92: ! 93: for (; *argv != NULL; argv++) { ! 94: while ((len + (i = strlen(*argv))) > count) { ! 95: count += BUF_SIZE; ! 96: if ((buf = realloc(buf, count)) == NULL) ! 97: fatal("cannot allocate memory"); ! 98: } ! 99: ! 100: /* If it is not the first string, write string separator */ ! 101: if (len > 1) ! 102: strcpy(buf + len++ - 1, " "); ! 103: ! 104: strcpy(buf + len - 1, *argv); ! 105: len += i; ! 106: } ! 107: return (realloc(buf, len)); ! 108: } ! 109: ! 110: /* ! 111: * Print a message on a terminal and die. The question is we have to open ! 112: * a terminal. ! 113: */ ! 114: fatal(msg) ! 115: char *msg; ! 116: { ! 117: extern char *ttyname(); ! 118: FILE *fp; /* File pointer to a terminal */ ! 119: ! 120: if ((fp = fopen("/dev/tty", "w", fp)) != NULL) ! 121: fprintf(fp, "nohup: %r\n", &msg); ! 122: exit(1); ! 123: } ! 124: ! 125: /* ! 126: * Find a name of output file. It is nohup.out or $HOME/nohup.out if ! 127: * nohup.out is not writeable. ! 128: */ ! 129: char *outname() ! 130: { ! 131: extern char *getenv(); ! 132: char *buf; /* Output file name buffer */ ! 133: char *dir; /* User home directory */ ! 134: int bufsize; /* Size of output file name */ ! 135: char *nohup_out = "nohup.out"; /* Name of output file */ ! 136: char *home = "HOME"; /* HOME envir. variable */ ! 137: ! 138: buf = nohup_out; ! 139: /* Can we write into the current directory? */ ! 140: if (access(buf, AAPPND) && access(".", ACREAT)) { ! 141: buf = nohup_out; ! 142: dir = getenv(home); /* Get $HOME directory */ ! 143: bufsize = strlen(dir); ! 144: /* Allocate memory for output file $HOME/nohup.out */ ! 145: if ((buf = malloc(bufsize + strlen(nohup_out) + 1)) == NULL) ! 146: fatal("cannot allocate memory"); ! 147: /* Constract the name of the output file */ ! 148: strcpy(buf, dir); ! 149: buf[bufsize] = '/'; ! 150: strcpy(buf + bufsize + 1, nohup_out); ! 151: /* Can we write into the $HOME directory? */ ! 152: if (access(buf, AAPPND) && access(dir, ACREAT)) ! 153: fatal("cannot open output file"); ! 154: } ! 155: return(buf); ! 156: } ! 157: ! 158: ! 159: ! 160: ! 161:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.