11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 1999-2004 Damien Miller <djm@mindrot.org> 41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Permission to use, copy, modify, and distribute this software for any 61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * purpose with or without fee is hereby granted, provided that the above 71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * copyright notice and this permission notice appear in all copies. 81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "includes.h" 191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <sys/types.h> 211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef HAVE_SYS_SELECT_H 221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# include <sys/select.h> 231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef HAVE_SYS_TIME_H 251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# include <sys/time.h> 261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <string.h> 291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <signal.h> 301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <stdlib.h> 311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <unistd.h> 321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "xmalloc.h" 341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE___PROGNAME 361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodchar *__progname; 371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * NB. duplicate __progname in case it is an alias for argv[0] 411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Otherwise it may get clobbered by setproctitle() 421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodchar *ssh_get_progname(char *argv0) 441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef HAVE___PROGNAME 461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood extern char *__progname; 471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return xstrdup(__progname); 491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#else 501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char *p; 511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (argv0 == NULL) 531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return ("unknown"); /* XXX */ 541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood p = strrchr(argv0, '/'); 551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (p == NULL) 561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood p = argv0; 571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else 581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood p++; 591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (xstrdup(p)); 611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_SETLOGIN 651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint setlogin(const char *name) 661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* !HAVE_SETLOGIN */ 701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_INNETGR 721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint innetgr(const char *netgroup, const char *host, 731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood const char *user, const char *domain) 741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* HAVE_INNETGR */ 781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) 801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint seteuid(uid_t euid) 811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (setreuid(-1, euid)); 831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */ 851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#if !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) 871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint setegid(uid_t egid) 881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return(setresgid(-1, egid, -1)); 901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) */ 921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#if !defined(HAVE_STRERROR) && defined(HAVE_SYS_ERRLIST) && defined(HAVE_SYS_NERR) 941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodconst char *strerror(int e) 951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood extern int sys_nerr; 971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood extern char *sys_errlist[]; 981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if ((e >= 0) && (e < sys_nerr)) 1001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (sys_errlist[e]); 1011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return ("unlisted error"); 1031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 1051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_UTIMES 1071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint utimes(char *filename, struct timeval *tvp) 1081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct utimbuf ub; 1101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ub.actime = tvp[0].tv_sec; 1121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ub.modtime = tvp[1].tv_sec; 1131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (utime(filename, &ub)); 1151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 1171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_TRUNCATE 1191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint truncate(const char *path, off_t length) 1201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood int fd, ret, saverrno; 1221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fd = open(path, O_WRONLY); 1241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (fd < 0) 1251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (-1); 1261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ret = ftruncate(fd, length); 1281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood saverrno = errno; 1291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood close(fd); 1301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ret == -1) 1311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood errno = saverrno; 1321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return(ret); 1341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* HAVE_TRUNCATE */ 1361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#if !defined(HAVE_NANOSLEEP) && !defined(HAVE_NSLEEP) 1381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint nanosleep(const struct timespec *req, struct timespec *rem) 1391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood int rc, saverrno; 1411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood extern int errno; 1421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct timeval tstart, tstop, tremain, time2wait; 1431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood TIMESPEC_TO_TIMEVAL(&time2wait, req) 1451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood (void) gettimeofday(&tstart, NULL); 1461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood rc = select(0, NULL, NULL, NULL, &time2wait); 1471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (rc == -1) { 1481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood saverrno = errno; 1491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood (void) gettimeofday (&tstop, NULL); 1501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood errno = saverrno; 1511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood tremain.tv_sec = time2wait.tv_sec - 1521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood (tstop.tv_sec - tstart.tv_sec); 1531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood tremain.tv_usec = time2wait.tv_usec - 1541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood (tstop.tv_usec - tstart.tv_usec); 1551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood tremain.tv_sec += tremain.tv_usec / 1000000L; 1561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood tremain.tv_usec %= 1000000L; 1571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } else { 1581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood tremain.tv_sec = 0; 1591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood tremain.tv_usec = 0; 1601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 1611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (rem != NULL) 1621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood TIMEVAL_TO_TIMESPEC(&tremain, rem) 1631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return(rc); 1651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 1671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_TCGETPGRP 1691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodpid_t 1701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodtcgetpgrp(int fd) 1711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood int ctty_pgrp; 1731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ioctl(fd, TIOCGPGRP, &ctty_pgrp) == -1) 1751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return(-1); 1761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else 1771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return(ctty_pgrp); 1781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 1791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* HAVE_TCGETPGRP */ 1801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_TCSENDBREAK 1821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint 1831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodtcsendbreak(int fd, int duration) 1841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 1851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# if defined(TIOCSBRK) && defined(TIOCCBRK) 1861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct timeval sleepytime; 1871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood sleepytime.tv_sec = 0; 1891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood sleepytime.tv_usec = 400000; 1901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ioctl(fd, TIOCSBRK, 0) == -1) 1911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (-1); 1921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood (void)select(0, 0, 0, 0, &sleepytime); 1931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ioctl(fd, TIOCCBRK, 0) == -1) 1941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (-1); 1951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (0); 1961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# else 1971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return -1; 1981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood# endif 1991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif /* HAVE_TCSENDBREAK */ 2011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodmysig_t 2031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodmysignal(int sig, mysig_t act) 2041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 2051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef HAVE_SIGACTION 2061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood struct sigaction sa, osa; 2071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (sigaction(sig, NULL, &osa) == -1) 2091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (mysig_t) -1; 2101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (osa.sa_handler != act) { 2111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood memset(&sa, 0, sizeof(sa)); 2121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood sigemptyset(&sa.sa_mask); 2131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood sa.sa_flags = 0; 2141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifdef SA_INTERRUPT 2151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (sig == SIGALRM) 2161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood sa.sa_flags |= SA_INTERRUPT; 2171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 2181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood sa.sa_handler = act; 2191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (sigaction(sig, &sa, NULL) == -1) 2201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (mysig_t) -1; 2211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood } 2221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (osa.sa_handler); 2231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#else 2241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood #undef signal 2251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (signal(sig, act)); 2261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 2271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_STRDUP 2301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodchar * 2311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodstrdup(const char *str) 2321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 2331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood size_t len; 2341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char *cp; 2351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood len = strlen(str) + 1; 2371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood cp = malloc(len); 2381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (cp != NULL) 2391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return(memcpy(cp, str, len)); 2401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return NULL; 2411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 2431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 2441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#ifndef HAVE_ISBLANK 2451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint isblank(int c) 2461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 2471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (c == ' ' || c == '\t'); 2481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 2491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#endif 250