|
|
1.1 root 1: /*
2: * cronpipe.c
3: * Special version of popen, that allows to cron keep track about
4: * children.
5: */
6: #include <stdio.h>
7: #include <signal.h>
8: #include <time.h>
9: #include <sys/types.h>
10: #include "cron.h"
11:
12: #define R 0 /* Pipe read descriptor index */
13: #define W 1 /* Pipe write descriptor index */
14:
15: extern child_id *add_entry(); /* Add an new entry to a link list */
16: extern int ifmail();
17:
18: extern char acRealUser[MAX_UNAME];
19: extern time_t clock;
20: extern child_id *current; /* Pointer to the current child id */
21: extern int flag320;
22: extern int mailFlag;
23: extern int set_uid_flag;
24:
25: static int poppid[_NFILE];
26:
27: FILE *
28: cronpipe(command, type)
29: char *command, *type;
30: {
31: register mode;
32: register fd;
33: int pd[2];
34:
35: if (pipe(pd) < 0)
36: return (NULL);
37: if (*type == 'w') {
38: mode = W;
39: fd = pd[W];
40: } else {
41: mode = R;
42: fd = pd[R];
43: }
44: if ((poppid[fd] = fork()) < 0) {
45: close(pd[R]);
46: close(pd[W]);
47: return (NULL);
48: }
49: if (poppid[fd] == 0) { /* Child */
50: /* Set uid to user which crontab is going to be executed.
51: * In case of COHERENT3.2.0 set uid to daemon (set_uid_flag
52: * is TRUE).
53: */
54: Dprint("Set user ID to '%s'\n", acRealUser);
55: if (set_uid_flag == FALSE) {
56: /* If file name is not user name ignore it */
57: if ((set_uid_flag = set_uid(acRealUser)) != TRUE) {
58: /* During testing were user traps
59: from smail. So they may come from here.
60: if (ifmail(acRealUser)) {
61: char mailBuf[80];
62: sprintf(mailBuf,"smail %s < %s"
63: "cron: cannot find/set user '%s'\n",
64: acRealUser, acRealUser);
65: system(mailBuf);
66: }*/
67: exit(0);
68: }
69: }
70: if (mode == W) {
71: close(pd[W]);
72: close(fileno(stdin));
73: dup(pd[R]);
74: close(pd[R]);
75: } else {
76: close(pd[R]);
77: close(fileno(stdout));
78: dup(pd[W]);
79: close(pd[W]);
80: }
81: Dprint("cronpipe: before execl %s\n", command);
82: execl("/bin/sh", "sh", "-c", command, NULL);
83: exit(1);
84: }
85: /* Parent */
86: /* We will keep track about keeds only in SV mode */
87: if (flag320 == FALSE) {
88: Dprint("cronpipe before fork: Name %s\t", acRealUser);
89: Dprint(" Pid %d\t", poppid[fd]);
90: Dprint(" Command %s\n", command);
91: current = add_entry(poppid[fd], acRealUser, clock, command);
92: Dprint("cronpipe: after add. Pid is %d\n", current->pid);
93: }
94: if (mode == W) {
95: close(pd[R]);
96: return (fdopen(pd[W], "w"));
97: } else {
98: close(pd[W]);
99: return (fdopen(pd[R], "r"));
100: }
101: }
102:
103: pclose(stream)
104: FILE *stream;
105: {
106: register fd;
107: register pid, wpid;
108: int status;
109: int (*hupfun)(), (*intfun)(), (*quitfun)();
110:
111: fd = fileno(stream);
112: pid = poppid[fd];
113: poppid[fd] = 0;
114: if (pid==0 || fclose(stream)==EOF)
115: return (-1);
116: hupfun = signal(SIGHUP, SIG_IGN);
117: intfun = signal(SIGINT, SIG_IGN);
118: quitfun = signal(SIGQUIT, SIG_IGN);
119: while ((wpid = wait(&status))!=pid && wpid>=0)
120: ;
121: if (wpid < 0)
122: status = -1;
123: signal(SIGHUP, hupfun);
124: signal(SIGINT, intfun);
125: signal(SIGQUIT, quitfun);
126: return (status);
127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.