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