271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
|
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
|
-
+
+
+
|
setuid(getuid());
raise(signum);
}
#endif
static int pty_open_slave(Pty pty)
{
if (pty->slave_fd < 0)
if (pty->slave_fd < 0) {
pty->slave_fd = open(pty->name, O_RDWR);
fcntl(pty->slave_fd, F_SETFD, FD_CLOEXEC);
}
return pty->slave_fd;
}
static void pty_open_master(Pty pty)
{
#ifdef BSD_PTYS
|
302
303
304
305
306
307
308
309
310
311
312
313
314
315
|
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
|
+
+
|
* able to open the slave side of the pty. We
* wouldn't want to allocate the wrong master,
* get all the way down to forking, and _then_
* find we're unable to open the slave.
*/
strcpy(pty->name, master_name);
pty->name[5] = 't'; /* /dev/ptyXX -> /dev/ttyXX */
fcntl(pty->master_fd, F_SETFD, FD_CLOEXEC);
if (pty_open_slave(pty) >= 0 &&
access(pty->name, R_OK | W_OK) == 0)
goto got_one;
if (pty->slave_fd > 0)
close(pty->slave_fd);
pty->slave_fd = -1;
|
341
342
343
344
345
346
347
348
349
350
351
352
353
354
|
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
|
+
+
|
exit(1);
}
if (unlockpt(pty->master_fd) < 0) {
perror("unlockpt");
exit(1);
}
fcntl(pty->master_fd, F_SETFD, FD_CLOEXEC);
pty->name[FILENAME_MAX-1] = '\0';
strncpy(pty->name, ptsname(pty->master_fd), FILENAME_MAX-1);
#endif
{
/*
|