1d74d50a8SDag-Erling Smørgrav 283d2307dSDag-Erling Smørgrav /* 3efcad6b7SDag-Erling Smørgrav * Copyright (c) 1999-2004 Damien Miller <djm@mindrot.org> 483d2307dSDag-Erling Smørgrav * 5efcad6b7SDag-Erling Smørgrav * Permission to use, copy, modify, and distribute this software for any 6efcad6b7SDag-Erling Smørgrav * purpose with or without fee is hereby granted, provided that the above 7efcad6b7SDag-Erling Smørgrav * copyright notice and this permission notice appear in all copies. 883d2307dSDag-Erling Smørgrav * 9efcad6b7SDag-Erling Smørgrav * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10efcad6b7SDag-Erling Smørgrav * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11efcad6b7SDag-Erling Smørgrav * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12efcad6b7SDag-Erling Smørgrav * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13efcad6b7SDag-Erling Smørgrav * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14efcad6b7SDag-Erling Smørgrav * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15efcad6b7SDag-Erling Smørgrav * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1683d2307dSDag-Erling Smørgrav */ 1783d2307dSDag-Erling Smørgrav 1883d2307dSDag-Erling Smørgrav #include "includes.h" 19d0c8c0bcSDag-Erling Smørgrav #include "xmalloc.h" 2083d2307dSDag-Erling Smørgrav 21021d409fSDag-Erling Smørgrav RCSID("$Id: bsd-misc.c,v 1.28 2005/11/01 22:07:31 dtucker Exp $"); 22d74d50a8SDag-Erling Smørgrav 23d74d50a8SDag-Erling Smørgrav #ifndef HAVE___PROGNAME 24d74d50a8SDag-Erling Smørgrav char *__progname; 25d74d50a8SDag-Erling Smørgrav #endif 2683d2307dSDag-Erling Smørgrav 27d0c8c0bcSDag-Erling Smørgrav /* 28d0c8c0bcSDag-Erling Smørgrav * NB. duplicate __progname in case it is an alias for argv[0] 29d0c8c0bcSDag-Erling Smørgrav * Otherwise it may get clobbered by setproctitle() 30d0c8c0bcSDag-Erling Smørgrav */ 31d95e11bfSDag-Erling Smørgrav char *ssh_get_progname(char *argv0) 3283d2307dSDag-Erling Smørgrav { 3383d2307dSDag-Erling Smørgrav #ifdef HAVE___PROGNAME 3483d2307dSDag-Erling Smørgrav extern char *__progname; 3583d2307dSDag-Erling Smørgrav 36d0c8c0bcSDag-Erling Smørgrav return xstrdup(__progname); 3783d2307dSDag-Erling Smørgrav #else 3883d2307dSDag-Erling Smørgrav char *p; 3983d2307dSDag-Erling Smørgrav 4083d2307dSDag-Erling Smørgrav if (argv0 == NULL) 41d95e11bfSDag-Erling Smørgrav return ("unknown"); /* XXX */ 4283d2307dSDag-Erling Smørgrav p = strrchr(argv0, '/'); 4383d2307dSDag-Erling Smørgrav if (p == NULL) 4483d2307dSDag-Erling Smørgrav p = argv0; 4583d2307dSDag-Erling Smørgrav else 4683d2307dSDag-Erling Smørgrav p++; 47d0c8c0bcSDag-Erling Smørgrav 48d95e11bfSDag-Erling Smørgrav return (xstrdup(p)); 4983d2307dSDag-Erling Smørgrav #endif 5083d2307dSDag-Erling Smørgrav } 5183d2307dSDag-Erling Smørgrav 5283d2307dSDag-Erling Smørgrav #ifndef HAVE_SETLOGIN 5383d2307dSDag-Erling Smørgrav int setlogin(const char *name) 5483d2307dSDag-Erling Smørgrav { 5583d2307dSDag-Erling Smørgrav return (0); 5683d2307dSDag-Erling Smørgrav } 5783d2307dSDag-Erling Smørgrav #endif /* !HAVE_SETLOGIN */ 5883d2307dSDag-Erling Smørgrav 5983d2307dSDag-Erling Smørgrav #ifndef HAVE_INNETGR 6083d2307dSDag-Erling Smørgrav int innetgr(const char *netgroup, const char *host, 6183d2307dSDag-Erling Smørgrav const char *user, const char *domain) 6283d2307dSDag-Erling Smørgrav { 6383d2307dSDag-Erling Smørgrav return (0); 6483d2307dSDag-Erling Smørgrav } 6583d2307dSDag-Erling Smørgrav #endif /* HAVE_INNETGR */ 6683d2307dSDag-Erling Smørgrav 6783d2307dSDag-Erling Smørgrav #if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) 6883d2307dSDag-Erling Smørgrav int seteuid(uid_t euid) 6983d2307dSDag-Erling Smørgrav { 7083d2307dSDag-Erling Smørgrav return (setreuid(-1, euid)); 7183d2307dSDag-Erling Smørgrav } 7283d2307dSDag-Erling Smørgrav #endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */ 7383d2307dSDag-Erling Smørgrav 7483d2307dSDag-Erling Smørgrav #if !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) 7583d2307dSDag-Erling Smørgrav int setegid(uid_t egid) 7683d2307dSDag-Erling Smørgrav { 7783d2307dSDag-Erling Smørgrav return(setresgid(-1, egid, -1)); 7883d2307dSDag-Erling Smørgrav } 7983d2307dSDag-Erling Smørgrav #endif /* !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) */ 8083d2307dSDag-Erling Smørgrav 8183d2307dSDag-Erling Smørgrav #if !defined(HAVE_STRERROR) && defined(HAVE_SYS_ERRLIST) && defined(HAVE_SYS_NERR) 8283d2307dSDag-Erling Smørgrav const char *strerror(int e) 8383d2307dSDag-Erling Smørgrav { 8483d2307dSDag-Erling Smørgrav extern int sys_nerr; 8583d2307dSDag-Erling Smørgrav extern char *sys_errlist[]; 8683d2307dSDag-Erling Smørgrav 8783d2307dSDag-Erling Smørgrav if ((e >= 0) && (e < sys_nerr)) 8883d2307dSDag-Erling Smørgrav return (sys_errlist[e]); 89d95e11bfSDag-Erling Smørgrav 9083d2307dSDag-Erling Smørgrav return ("unlisted error"); 9183d2307dSDag-Erling Smørgrav } 9283d2307dSDag-Erling Smørgrav #endif 9383d2307dSDag-Erling Smørgrav 9483d2307dSDag-Erling Smørgrav #ifndef HAVE_UTIMES 9583d2307dSDag-Erling Smørgrav int utimes(char *filename, struct timeval *tvp) 9683d2307dSDag-Erling Smørgrav { 9783d2307dSDag-Erling Smørgrav struct utimbuf ub; 9883d2307dSDag-Erling Smørgrav 994b17dab0SDag-Erling Smørgrav ub.actime = tvp[0].tv_sec; 1004b17dab0SDag-Erling Smørgrav ub.modtime = tvp[1].tv_sec; 10183d2307dSDag-Erling Smørgrav 10283d2307dSDag-Erling Smørgrav return (utime(filename, &ub)); 10383d2307dSDag-Erling Smørgrav } 10483d2307dSDag-Erling Smørgrav #endif 10583d2307dSDag-Erling Smørgrav 10683d2307dSDag-Erling Smørgrav #ifndef HAVE_TRUNCATE 10783d2307dSDag-Erling Smørgrav int truncate(const char *path, off_t length) 10883d2307dSDag-Erling Smørgrav { 10983d2307dSDag-Erling Smørgrav int fd, ret, saverrno; 11083d2307dSDag-Erling Smørgrav 11183d2307dSDag-Erling Smørgrav fd = open(path, O_WRONLY); 11283d2307dSDag-Erling Smørgrav if (fd < 0) 113d95e11bfSDag-Erling Smørgrav return (-1); 11483d2307dSDag-Erling Smørgrav 11583d2307dSDag-Erling Smørgrav ret = ftruncate(fd, length); 11683d2307dSDag-Erling Smørgrav saverrno = errno; 117d95e11bfSDag-Erling Smørgrav close(fd); 11883d2307dSDag-Erling Smørgrav if (ret == -1) 11983d2307dSDag-Erling Smørgrav errno = saverrno; 120d95e11bfSDag-Erling Smørgrav 12183d2307dSDag-Erling Smørgrav return(ret); 12283d2307dSDag-Erling Smørgrav } 12383d2307dSDag-Erling Smørgrav #endif /* HAVE_TRUNCATE */ 12483d2307dSDag-Erling Smørgrav 125d0c8c0bcSDag-Erling Smørgrav #if !defined(HAVE_NANOSLEEP) && !defined(HAVE_NSLEEP) 126d0c8c0bcSDag-Erling Smørgrav int nanosleep(const struct timespec *req, struct timespec *rem) 127d0c8c0bcSDag-Erling Smørgrav { 128d0c8c0bcSDag-Erling Smørgrav int rc, saverrno; 129d0c8c0bcSDag-Erling Smørgrav extern int errno; 130d0c8c0bcSDag-Erling Smørgrav struct timeval tstart, tstop, tremain, time2wait; 131d0c8c0bcSDag-Erling Smørgrav 132d0c8c0bcSDag-Erling Smørgrav TIMESPEC_TO_TIMEVAL(&time2wait, req) 133d0c8c0bcSDag-Erling Smørgrav (void) gettimeofday(&tstart, NULL); 134d0c8c0bcSDag-Erling Smørgrav rc = select(0, NULL, NULL, NULL, &time2wait); 135d0c8c0bcSDag-Erling Smørgrav if (rc == -1) { 136d0c8c0bcSDag-Erling Smørgrav saverrno = errno; 137d0c8c0bcSDag-Erling Smørgrav (void) gettimeofday (&tstop, NULL); 138d0c8c0bcSDag-Erling Smørgrav errno = saverrno; 139d0c8c0bcSDag-Erling Smørgrav tremain.tv_sec = time2wait.tv_sec - 140d0c8c0bcSDag-Erling Smørgrav (tstop.tv_sec - tstart.tv_sec); 141d0c8c0bcSDag-Erling Smørgrav tremain.tv_usec = time2wait.tv_usec - 142d0c8c0bcSDag-Erling Smørgrav (tstop.tv_usec - tstart.tv_usec); 143d0c8c0bcSDag-Erling Smørgrav tremain.tv_sec += tremain.tv_usec / 1000000L; 144d0c8c0bcSDag-Erling Smørgrav tremain.tv_usec %= 1000000L; 145d0c8c0bcSDag-Erling Smørgrav } else { 146d0c8c0bcSDag-Erling Smørgrav tremain.tv_sec = 0; 147d0c8c0bcSDag-Erling Smørgrav tremain.tv_usec = 0; 148d0c8c0bcSDag-Erling Smørgrav } 149d0c8c0bcSDag-Erling Smørgrav TIMEVAL_TO_TIMESPEC(&tremain, rem) 150d0c8c0bcSDag-Erling Smørgrav 151d0c8c0bcSDag-Erling Smørgrav return(rc); 152d0c8c0bcSDag-Erling Smørgrav } 153d0c8c0bcSDag-Erling Smørgrav #endif 154d0c8c0bcSDag-Erling Smørgrav 155d95e11bfSDag-Erling Smørgrav #ifndef HAVE_TCGETPGRP 156d95e11bfSDag-Erling Smørgrav pid_t 157d95e11bfSDag-Erling Smørgrav tcgetpgrp(int fd) 158d95e11bfSDag-Erling Smørgrav { 159d95e11bfSDag-Erling Smørgrav int ctty_pgrp; 160d95e11bfSDag-Erling Smørgrav 161d95e11bfSDag-Erling Smørgrav if (ioctl(fd, TIOCGPGRP, &ctty_pgrp) == -1) 162d95e11bfSDag-Erling Smørgrav return(-1); 163d95e11bfSDag-Erling Smørgrav else 164d95e11bfSDag-Erling Smørgrav return(ctty_pgrp); 165d95e11bfSDag-Erling Smørgrav } 166d95e11bfSDag-Erling Smørgrav #endif /* HAVE_TCGETPGRP */ 167d95e11bfSDag-Erling Smørgrav 168d95e11bfSDag-Erling Smørgrav #ifndef HAVE_TCSENDBREAK 169d95e11bfSDag-Erling Smørgrav int 170d95e11bfSDag-Erling Smørgrav tcsendbreak(int fd, int duration) 171d95e11bfSDag-Erling Smørgrav { 172d95e11bfSDag-Erling Smørgrav # if defined(TIOCSBRK) && defined(TIOCCBRK) 173d95e11bfSDag-Erling Smørgrav struct timeval sleepytime; 174d95e11bfSDag-Erling Smørgrav 175d95e11bfSDag-Erling Smørgrav sleepytime.tv_sec = 0; 176d95e11bfSDag-Erling Smørgrav sleepytime.tv_usec = 400000; 177d95e11bfSDag-Erling Smørgrav if (ioctl(fd, TIOCSBRK, 0) == -1) 178d95e11bfSDag-Erling Smørgrav return (-1); 179d95e11bfSDag-Erling Smørgrav (void)select(0, 0, 0, 0, &sleepytime); 180d95e11bfSDag-Erling Smørgrav if (ioctl(fd, TIOCCBRK, 0) == -1) 181d95e11bfSDag-Erling Smørgrav return (-1); 182d95e11bfSDag-Erling Smørgrav return (0); 183d95e11bfSDag-Erling Smørgrav # else 184d95e11bfSDag-Erling Smørgrav return -1; 185d95e11bfSDag-Erling Smørgrav # endif 186d95e11bfSDag-Erling Smørgrav } 187d95e11bfSDag-Erling Smørgrav #endif /* HAVE_TCSENDBREAK */ 188d95e11bfSDag-Erling Smørgrav 189d95e11bfSDag-Erling Smørgrav mysig_t 190d95e11bfSDag-Erling Smørgrav mysignal(int sig, mysig_t act) 191d95e11bfSDag-Erling Smørgrav { 192d95e11bfSDag-Erling Smørgrav #ifdef HAVE_SIGACTION 193d95e11bfSDag-Erling Smørgrav struct sigaction sa, osa; 194d95e11bfSDag-Erling Smørgrav 195d95e11bfSDag-Erling Smørgrav if (sigaction(sig, NULL, &osa) == -1) 196d95e11bfSDag-Erling Smørgrav return (mysig_t) -1; 197d95e11bfSDag-Erling Smørgrav if (osa.sa_handler != act) { 198d95e11bfSDag-Erling Smørgrav memset(&sa, 0, sizeof(sa)); 199d95e11bfSDag-Erling Smørgrav sigemptyset(&sa.sa_mask); 200d95e11bfSDag-Erling Smørgrav sa.sa_flags = 0; 201d95e11bfSDag-Erling Smørgrav #ifdef SA_INTERRUPT 202d95e11bfSDag-Erling Smørgrav if (sig == SIGALRM) 203d95e11bfSDag-Erling Smørgrav sa.sa_flags |= SA_INTERRUPT; 204d95e11bfSDag-Erling Smørgrav #endif 205d95e11bfSDag-Erling Smørgrav sa.sa_handler = act; 206d95e11bfSDag-Erling Smørgrav if (sigaction(sig, &sa, NULL) == -1) 207d95e11bfSDag-Erling Smørgrav return (mysig_t) -1; 208d95e11bfSDag-Erling Smørgrav } 209d95e11bfSDag-Erling Smørgrav return (osa.sa_handler); 210d95e11bfSDag-Erling Smørgrav #else 211efcad6b7SDag-Erling Smørgrav #undef signal 212d95e11bfSDag-Erling Smørgrav return (signal(sig, act)); 213d95e11bfSDag-Erling Smørgrav #endif 214d95e11bfSDag-Erling Smørgrav } 215043840dfSDag-Erling Smørgrav 216043840dfSDag-Erling Smørgrav #ifndef HAVE_STRDUP 217043840dfSDag-Erling Smørgrav char * 218043840dfSDag-Erling Smørgrav strdup(const char *str) 219043840dfSDag-Erling Smørgrav { 220043840dfSDag-Erling Smørgrav size_t len; 221043840dfSDag-Erling Smørgrav char *cp; 222043840dfSDag-Erling Smørgrav 223043840dfSDag-Erling Smørgrav len = strlen(str) + 1; 224043840dfSDag-Erling Smørgrav cp = malloc(len); 225043840dfSDag-Erling Smørgrav if (cp != NULL) 226021d409fSDag-Erling Smørgrav return(memcpy(cp, str, len)); 227043840dfSDag-Erling Smørgrav return NULL; 228043840dfSDag-Erling Smørgrav } 229043840dfSDag-Erling Smørgrav #endif 230