annotate uip/rcvtty.c @ 16:07f8972434be

fix for Yosemita Clang
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 12 Nov 2014 02:46:27 +0900
parents 3c5835cca094
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* rcvtty.c - a rcvmail program (a lot like rcvalert) handling IPC ttys */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3 static char ident[] = "@(#)$Id: rcvtty.c,v 1.1.1.1 2005/04/18 14:46:07 kono Exp $";
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #ifndef BSD42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #undef TTYD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #include "../h/rcvmail.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include "../h/scansbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #include "../zotnet/tws.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13 #include <signal.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 #include <sys/stat.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15 #ifndef TTYD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 #include <utmp.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 #ifndef UTMP_FILENAME
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 #ifdef UTMP_FILE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19 #define UTMP_FILENAME UTMP_FILE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 #ifdef _PATH_UTMP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 #define UTMP_FILENAME _PATH_UTMP
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 #define UTMP_FILENAME "/etc/utmp"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 #endif /* UTMP_FILENAME */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 #endif /* not TTYD */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30 #include <locale.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 #endif
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
32 //#ifdef UNISTD
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 #include <unistd.h>
12
441a2190cfae Lion fix
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
34 //#endif
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 #ifdef MIME_HEADERS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 #define SCANFMT \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 "%2(hour{dtimenow}):%02(min{dtimenow}): %<(size)%5(size) %>%<{encrypted}E%>\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 %<(mymbox{from})%<{to}To:%14(hdecode(friendly{to}))%>%>\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41 %<(zero)%17(hdecode(friendly{from}))%> \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 %(hdecode{subject})%<{body}<<%{body}>>%>"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43 #else /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 #define SCANFMT \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45 "%2(hour{dtimenow}):%02(min{dtimenow}): %<(size)%5(size) %>%<{encrypted}E%>\
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 %<(mymbox{from})%<{to}To:%14(friendly{to})%>%>%<(zero)%17(friendly{from})%> \
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47 %{subject}%<{body}<<%{body}>>%>"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 #endif /* MIME_HEADERS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 static struct swit switches[] = {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51 #define HELPSW 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 "help", 4,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 #define BIFFSW 1
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 "biff", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57 #define FORMSW 2
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 "form formatfile", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 #define FMTSW 3
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 "format string", 5,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62 #define NLSW 4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 "newline", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 #define NNLSW 5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 "nonewline", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66 #define BELSW 6
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 "bell", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68 #define NBELSW 7
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 "nobell", 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 NULL, 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 };
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 static jmp_buf myctx;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 off_t lseek ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 char *getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81 static int message_fd(), header_fd();
16
07f8972434be fix for Yosemita Clang
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
82 static void alert();
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 static int bell = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 static int newline = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 static int biff = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 static char *form = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88 static char *format = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94 #ifdef BSD43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 static int return_gid;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 #endif /* BSD43 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 main (argc, argv)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 int argc;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 char **argv;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 int md,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 vecp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 char *cp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105 *user,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106 buf[100],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 **ap,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108 **argp,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 *arguments[MAXARGS],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110 *vec[MAXARGS];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 #ifndef TTYD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 char tty[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 struct utmp ut;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 register FILE *uf;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 #endif /* not TTYD */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 #ifdef BSD43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 return_gid = getegid(); /* Save effective gid, assuming we'll use it */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 setegid(getgid()); /* Turn off extraordinary privileges */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 #endif /* BSD43 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 #ifdef LOCALE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 setlocale(LC_ALL, "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 ml_init();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 invo_name = r1bindex (argv[0], '/');
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 if (strlen(invo_name) > NAMESZ) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 fprintf(stderr, "%s: argv[0] too long\n", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 exit(1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 mts_init (invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 if ((cp = m_find (invo_name)) != NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 ap = brkstring (cp = getcpy (cp), " ", "\n");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 ap = copyip (ap, arguments);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 ap = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 if (argc > MAXARGS - (ap - arguments))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 adios (NULLCP, "too many arguments.");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 (void) copyip (argv + 1, ap);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 for (argp = arguments; *argp; argp++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 if (strlen(*argp) >= BUFSIZ / 4)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 adios (NULLCP, "argument too long");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 argp = arguments;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 while (cp = *argp++) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 if (*cp == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 switch (smatch (++cp, switches)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 case AMBIGSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 ambigsw (cp, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 case UNKWNSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 vec[vecp++] = --cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 case HELPSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 (void) sprintf (buf, "%s [command ...]", invo_name);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 help (buf, switches);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 done (1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 case BIFFSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 biff = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 case FORMSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 if (!(form = *argp++) || *form == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 format = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 case FMTSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 if (!(format = *argp++) || *format == '-')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 adios (NULLCP, "missing argument to %s", argp[-2]);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 form = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 case NLSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 newline = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 case NNLSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 newline = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 case BELSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 bell = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187 case NBELSW:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 bell = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 vec[vecp++] = cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 vec[vecp] = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 if ((md = vecp ? message_fd (vec) : header_fd ()) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 exit (RCV_MBX);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 user = getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202 #ifndef TTYD
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 if ((uf = fopen (UTMP_FILENAME, "r")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 exit (RCV_MBX);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 while (fread ((char *) &ut, sizeof ut, 1, uf) == 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206 if (ut.ut_name[0] != 0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 #ifdef UTMAXTYPE
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 && ut.ut_type == USER_PROCESS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210 && strncmp (user, ut.ut_name, sizeof ut.ut_name) == 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 (void) strncpy (tty, ut.ut_line, sizeof ut.ut_line);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 alert (tty, md);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 (void) fclose (uf);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215 #else /* TTYD */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 alert (user, md);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 #endif /* TTYD */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 exit (RCV_MOK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 static TYPESIG alrmser (i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 int i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 longjmp (myctx, DONE);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 static int message_fd (vec)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 char *vec[];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 int bytes,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 child_id,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 char tmpfil[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 (void) unlink (mktemp (strcpy (tmpfil, "/tmp/rcvttyXXXXX")));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 if ((fd = creat (tmpfil, 0600)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 return header_fd ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 if ((fd = open (tmpfil, 2)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 return header_fd ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 switch (child_id = vfork ()) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 case NOTOK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 return header_fd ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 rewind (stdin);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260 if (dup2 (fd, 1) == NOTOK || dup2 (fd, 2) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 closefds (3);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 #ifdef BSD42
13
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 12
diff changeset
264 (void) setpgrp (); // (void) setpgrp (0, getpid ());
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 #endif /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 #ifdef SVR4
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267 (void) setsid();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 #endif /* SVR4 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 execvp (vec[0], vec);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 _exit (-1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 switch (setjmp (myctx)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 (void) signal (SIGALRM, alrmser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 bytes = fstat (fileno (stdin), &st) != NOTOK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 ? (int) st.st_size : 100;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 if (bytes <= 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 bytes = 100;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 (void) alarm ((unsigned) (bytes * 60 + 300));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 (void) pidwait (child_id, OK);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 (void) alarm (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 if (fstat (fd, &st) != NOTOK && st.st_size > (off_t)0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 return fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 return header_fd ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 #ifndef BSD42
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 (void) kill (child_id, SIGKILL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293 #else /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 (void) killpg (child_id, SIGKILL);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 #endif /* BSD42 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 return header_fd ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 static int header_fd () {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 int fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 char tmpfil[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 (void) strcpy (tmpfil, m_tmpfil (invo_name));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 if ((fd = creat (tmpfil, 0600)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 (void) close (fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 if ((fd = open (tmpfil, 2)) == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314 return NOTOK;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 (void) unlink (tmpfil);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 rewind (stdin);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 (void) scan (stdin, 0, 0, new_fs (form, format, SCANFMT), 0, 0, 0,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 0, 0, 0L, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320 if ( newline )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 (void) write (fd, "\n\r", 2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 (void) write (fd, scanl, strlen (scanl));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 if ( bell )
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 (void) write (fd, "\007", 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 return fd;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 #ifndef TTYD
16
07f8972434be fix for Yosemita Clang
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13
diff changeset
332 static void alert (tty, md)
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 char *tty;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 int md;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 td;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338 char buffer[BUFSIZ],
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 ttyspec[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 struct stat st;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 (void) sprintf (ttyspec, "/dev/%s", tty);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 if (stat (ttyspec, &st) == NOTOK ||
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 (st.st_mode & (biff ? S_IEXEC :
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 #ifdef BSD43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 (S_IWRITE >> 3)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 #else /* BSD43 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 020
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 #endif /* BSD43 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 )) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 switch (setjmp (myctx)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 case OK:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 (void) signal (SIGALRM, alrmser);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 (void) alarm (2);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 #ifdef BSD43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 setegid(return_gid); /* Reset gid to open tty */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 #endif /* BSD43 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 td = open (ttyspec, 1);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 #ifdef BSD43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 setegid(getgid()); /* Return us to normal privileges */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 #endif /* BSD43 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 (void) alarm (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 if (td == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370 (void) alarm (0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 (void) lseek (md, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 FILE *fd = fdopen(td, "w");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 while ((i = read (md, buffer, sizeof buffer)) > 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 buffer[i] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 ml_fputs(buffer, fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 fflush(fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 fclose(fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386 #else /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 while ((i = read (md, buffer, sizeof buffer)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 if (write (td, buffer, i) != i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 (void) close (td);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 #else /* TTYD */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 static alert (user, md)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 register char *user;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 int md;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 int i,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 td;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 #ifdef BSD43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407 setegid(return_gid); /* Reset gid to open tty */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 #endif /* BSD43 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409 td = ttyw ("notify", NULLCP, NULLCP, user);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 #ifdef BSD43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 setegid(getgid()); /* Return us to normal privileges */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 #endif /* BSD43 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 if (td == NOTOK)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 (void) signal (SIGPIPE, SIG_IGN);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 (void) lseek (md, (off_t)0, 0);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 #ifdef JAPAN
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 FILE *fd = fdopen(td, "w");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 while ((i = read (md, buffer, sizeof buffer)) > 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 buffer[i] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 ml_fputs(buffer, fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 fflush(fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 fclose(fd);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 #else /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 while ((i = read (md, buffer, sizeof buffer)) > 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 if (write (td, buffer, i) != i)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 #endif /* JAPAN */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 (void) close (td);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 #endif /* TTYD */