| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 | /* * compat.c * * Compatibility functions for different OSes */#if HAVE_CONFIG_H#include "config.h"#endif#include "compat.h"#include "our_syslog.h"#ifndef HAVE_STRLCPY#include <string.h>#include <stdio.h>void strlcpy(char *dst, const char *src, size_t size){        strncpy(dst, src, size - 1);        dst[size - 1] = '\0';}#endif#ifndef HAVE_MEMMOVEvoid *memmove(void *dst, const void *src, size_t size){        bcopy(src, dst, size);        return dst;}#endif#ifndef HAVE_OPENPTY/* * Finds a free PTY/TTY pair. * * This is derived from C.S. Ananian's pty.c that was with his pptp client. * ************************************************************************* * pty.c - find a free pty/tty pair. *         inspired by the xterm source. *         NOTE: This is very likely to be highly non-portable. *         C. Scott Ananian <cananian@alumni.princeton.edu> * * Heavily modified to chage from getpseudopty() to openpty(). */#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#if HAVE_SYSLOG_H#include <syslog.h>#else#include "our_syslog.h"#endifint openpty(int *master, int *slave, char *name, void *unused1, void *unused2){        int devindex = 0, letter = 0;        int fd1, fd2;        char ttydev[PTYMAX], ptydev[TTYMAX];        syslog(LOG_DEBUG, "CTRL: Allocating pty/tty pair");        strcpy(ttydev, TTYDEV);        strcpy(ptydev, PTYDEV);        while (PTYCHAR1[letter]) {                ttydev[TTYMAX - 3] = ptydev[PTYMAX - 3] = PTYCHAR1[letter];                while (PTYCHAR2[devindex]) {                        ttydev[TTYMAX - 2] = ptydev[PTYMAX - 2] = PTYCHAR2[devindex];                        if ((fd1 = open(ptydev, O_RDWR)) >= 0) {                                if ((fd2 = open(ttydev, O_RDWR)) >= 0) {                                        goto out;                                } else {                                        close(fd1);                                }                        }                        devindex++;                }                devindex = 0;                letter++;        }        syslog(LOG_ERR, "CTRL: Failed to allocate pty");        return -1;              /* Unable to allocate pty */      out:        syslog(LOG_INFO, "CTRL: Allocated pty/tty pair (%s,%s)", ptydev, ttydev);        if (master)                *master = fd1;        if (slave)                *slave = fd2;        if (name)                strcpy(name, ttydev);   /* no way to bounds check */        return 0;}#endif#ifndef HAVE_STRERRORchar *strerror(int errnum) {        static char buf[16];        sprintf(buf, "Error %d", errnum);        return buf;}#endif#ifndef HAVE_SETPROCTITLE#include "inststr.h"#endif#define __USE_BSD 1#include <stdarg.h>#include <stdio.h>void my_setproctitle(int argc, char **argv, const char *format, ...) {       char proctitle[64];       va_list parms;       va_start(parms, format);       vsnprintf(proctitle, sizeof(proctitle), format, parms);#ifndef HAVE_SETPROCTITLE       inststr(argc, argv, proctitle);#else       setproctitle(proctitle);#endif       va_end(parms);}/* signal to pipe delivery implementation */#include <unistd.h>#include <fcntl.h>#include <signal.h>/* pipe private to process */static int sigpipe[2];/* create a signal pipe, returns 0 for success, -1 with errno for failure */int sigpipe_create(){  int rc;    rc = pipe(sigpipe);  if (rc < 0) return rc;    fcntl(sigpipe[0], F_SETFD, FD_CLOEXEC);  fcntl(sigpipe[1], F_SETFD, FD_CLOEXEC);  #ifdef O_NONBLOCK#define FLAG_TO_SET O_NONBLOCK#else#ifdef SYSV#define FLAG_TO_SET O_NDELAY#else /* BSD */#define FLAG_TO_SET FNDELAY#endif#endif    rc = fcntl(sigpipe[1], F_GETFL);  if (rc != -1)    rc = fcntl(sigpipe[1], F_SETFL, rc | FLAG_TO_SET);  if (rc < 0) return rc;  return 0;#undef FLAG_TO_SET}/* generic handler for signals, writes signal number to pipe */void sigpipe_handler(int signum){  if (write(sigpipe[1], &signum, sizeof(signum)) == -1) {    syslog_perror("sigpipe write");  }  signal(signum, sigpipe_handler);}/* assign a signal number to the pipe */void sigpipe_assign(int signum){  struct sigaction sa;  memset(&sa, 0, sizeof(sa));  sa.sa_handler = sigpipe_handler;  sigaction(signum, &sa, NULL);}/* return the signal pipe read file descriptor for select(2) */int sigpipe_fd(){  return sigpipe[0];}/* read and return the pending signal from the pipe */int sigpipe_read(){  int signum;  if (read(sigpipe[0], &signum, sizeof(signum)) == -1) {    syslog_perror("sigpipe read");    return 0;  }  return signum;}void sigpipe_close(){  close(sigpipe[0]);  close(sigpipe[1]);}
 |