* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#define RCSID "$Id: tty.c,v 1.19 2004/11/06 05:42:29 paulus Exp $"
+#define RCSID "$Id: tty.c,v 1.25 2006/06/04 07:04:57 paulus Exp $"
#include <stdio.h>
#include <ctype.h>
extern uid_t uid;
extern int kill_link;
+extern int asked_to_quit;
+extern int got_sigterm;
/* XXX */
extern int privopen; /* don't lock, open device as root */
struct stat statbuf;
int fdflags;
- if (demand && connect_script == 0) {
+ if (demand && notty) {
+ option_error("demand-dialling is incompatible with notty");
+ exit(EXIT_OPTION_ERROR);
+ }
+ if (demand && connect_script == 0 && ptycommand == NULL
+ && pty_socket == NULL) {
option_error("connect script is required for demand-dialling\n");
exit(EXIT_OPTION_ERROR);
}
* in order to wait for the carrier detect signal from the modem.
*/
hungup = 0;
- kill_link = 0;
+ got_sigterm = 0;
connector = doing_callback? callback_script: connect_script;
if (devnam[0] != 0) {
for (;;) {
int err, prio;
prio = privopen? OPRIO_ROOT: tty_options[0].priority;
- if (prio < OPRIO_ROOT)
- seteuid(uid);
+ if (prio < OPRIO_ROOT && seteuid(uid) == -1) {
+ error("Unable to drop privileges before opening %s: %m\n",
+ devnam);
+ status = EXIT_OPEN_FAILED;
+ goto errret;
+ }
real_ttyfd = open(devnam, O_NONBLOCK | O_RDWR, 0);
err = errno;
- if (prio < OPRIO_ROOT)
- seteuid(0);
+ if (prio < OPRIO_ROOT && seteuid(0) == -1)
+ fatal("Unable to regain privileges");
if (real_ttyfd >= 0)
break;
errno = err;
} else if (notty) {
if (!start_charshunt(0, 1))
goto errret;
+ dup2(fd_devnull, 0);
+ dup2(fd_devnull, 1);
+ if (log_to_fd == 1)
+ log_to_fd = -1;
+ if (log_to_fd != 2)
+ dup2(fd_devnull, 2);
} else if (record_file != NULL) {
int fd = dup(ttyfd);
if (!start_charshunt(fd, fd))
status = EXIT_INIT_FAILED;
goto errret;
}
- if (kill_link) {
+ if (got_sigterm) {
disconnect_tty();
goto errret;
}
status = EXIT_CONNECT_FAILED;
goto errret;
}
- if (kill_link) {
+ if (got_sigterm) {
disconnect_tty();
goto errret;
}
error("Failed to reopen %s: %m", devnam);
status = EXIT_OPEN_FAILED;
}
- if (!persist || errno != EINTR || hungup || kill_link)
+ if (!persist || errno != EINTR || hungup || got_sigterm)
goto errret;
}
close(i);
* time for something from the peer. This can avoid bouncing
* our packets off his tty before he has it set up.
*/
- if (connector != NULL || ptycommand != NULL)
+ if (connector != NULL || ptycommand != NULL || pty_socket != NULL)
listen_time = connect_delay;
return ttyfd;
close(pty_master);
pty_master = -1;
}
- if (pty_slave >= 0) {
- close(pty_slave);
- pty_slave = -1;
- }
- if (real_ttyfd >= 0) {
- close(real_ttyfd);
- real_ttyfd = -1;
- }
ttyfd = -1;
+ if (got_sigterm)
+ asked_to_quit = 1;
return -1;
}
} else {
info("Serial link disconnected.");
}
+ stop_charshunt(NULL, 0);
}
void tty_close_fds()
exit(0);
}
charshunt_pid = cpid;
- add_notifier(&sigreceived, stop_charshunt, 0);
record_child(cpid, "pppd (charshunt)", charshunt_done, NULL);
return 1;
}