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" 1983d2307dSDag-Erling Smørgrav 20d4af9e69SDag-Erling Smørgrav #include <sys/types.h> 21761efaa7SDag-Erling Smørgrav #ifdef HAVE_SYS_SELECT_H 22761efaa7SDag-Erling Smørgrav # include <sys/select.h> 23761efaa7SDag-Erling Smørgrav #endif 24761efaa7SDag-Erling Smørgrav #ifdef HAVE_SYS_TIME_H 25761efaa7SDag-Erling Smørgrav # include <sys/time.h> 26761efaa7SDag-Erling Smørgrav #endif 27761efaa7SDag-Erling Smørgrav 28*19261079SEd Maste #include <fcntl.h> 29761efaa7SDag-Erling Smørgrav #include <string.h> 30761efaa7SDag-Erling Smørgrav #include <signal.h> 31761efaa7SDag-Erling Smørgrav #include <stdlib.h> 32190cef3dSDag-Erling Smørgrav #include <stdio.h> 33f7167e0eSDag-Erling Smørgrav #include <time.h> 34d4af9e69SDag-Erling Smørgrav #include <unistd.h> 35761efaa7SDag-Erling Smørgrav 36d74d50a8SDag-Erling Smørgrav #ifndef HAVE___PROGNAME 37d74d50a8SDag-Erling Smørgrav char *__progname; 38d74d50a8SDag-Erling Smørgrav #endif 3983d2307dSDag-Erling Smørgrav 40d0c8c0bcSDag-Erling Smørgrav /* 41d0c8c0bcSDag-Erling Smørgrav * NB. duplicate __progname in case it is an alias for argv[0] 42d0c8c0bcSDag-Erling Smørgrav * Otherwise it may get clobbered by setproctitle() 43d0c8c0bcSDag-Erling Smørgrav */ 44d95e11bfSDag-Erling Smørgrav char *ssh_get_progname(char *argv0) 4583d2307dSDag-Erling Smørgrav { 46bc5531deSDag-Erling Smørgrav char *p, *q; 4783d2307dSDag-Erling Smørgrav #ifdef HAVE___PROGNAME 4883d2307dSDag-Erling Smørgrav extern char *__progname; 4983d2307dSDag-Erling Smørgrav 50bc5531deSDag-Erling Smørgrav p = __progname; 5183d2307dSDag-Erling Smørgrav #else 5283d2307dSDag-Erling Smørgrav if (argv0 == NULL) 53d95e11bfSDag-Erling Smørgrav return ("unknown"); /* XXX */ 5483d2307dSDag-Erling Smørgrav p = strrchr(argv0, '/'); 5583d2307dSDag-Erling Smørgrav if (p == NULL) 5683d2307dSDag-Erling Smørgrav p = argv0; 5783d2307dSDag-Erling Smørgrav else 5883d2307dSDag-Erling Smørgrav p++; 5983d2307dSDag-Erling Smørgrav #endif 60bc5531deSDag-Erling Smørgrav if ((q = strdup(p)) == NULL) { 61bc5531deSDag-Erling Smørgrav perror("strdup"); 62bc5531deSDag-Erling Smørgrav exit(1); 63bc5531deSDag-Erling Smørgrav } 64bc5531deSDag-Erling Smørgrav return q; 6583d2307dSDag-Erling Smørgrav } 6683d2307dSDag-Erling Smørgrav 6783d2307dSDag-Erling Smørgrav #ifndef HAVE_SETLOGIN 6883d2307dSDag-Erling Smørgrav int setlogin(const char *name) 6983d2307dSDag-Erling Smørgrav { 7083d2307dSDag-Erling Smørgrav return (0); 7183d2307dSDag-Erling Smørgrav } 7283d2307dSDag-Erling Smørgrav #endif /* !HAVE_SETLOGIN */ 7383d2307dSDag-Erling Smørgrav 7483d2307dSDag-Erling Smørgrav #ifndef HAVE_INNETGR 7583d2307dSDag-Erling Smørgrav int innetgr(const char *netgroup, const char *host, 7683d2307dSDag-Erling Smørgrav const char *user, const char *domain) 7783d2307dSDag-Erling Smørgrav { 7883d2307dSDag-Erling Smørgrav return (0); 7983d2307dSDag-Erling Smørgrav } 8083d2307dSDag-Erling Smørgrav #endif /* HAVE_INNETGR */ 8183d2307dSDag-Erling Smørgrav 8283d2307dSDag-Erling Smørgrav #if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) 8383d2307dSDag-Erling Smørgrav int seteuid(uid_t euid) 8483d2307dSDag-Erling Smørgrav { 8583d2307dSDag-Erling Smørgrav return (setreuid(-1, euid)); 8683d2307dSDag-Erling Smørgrav } 8783d2307dSDag-Erling Smørgrav #endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */ 8883d2307dSDag-Erling Smørgrav 8983d2307dSDag-Erling Smørgrav #if !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) 9083d2307dSDag-Erling Smørgrav int setegid(uid_t egid) 9183d2307dSDag-Erling Smørgrav { 9283d2307dSDag-Erling Smørgrav return(setresgid(-1, egid, -1)); 9383d2307dSDag-Erling Smørgrav } 9483d2307dSDag-Erling Smørgrav #endif /* !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) */ 9583d2307dSDag-Erling Smørgrav 9683d2307dSDag-Erling Smørgrav #if !defined(HAVE_STRERROR) && defined(HAVE_SYS_ERRLIST) && defined(HAVE_SYS_NERR) 9783d2307dSDag-Erling Smørgrav const char *strerror(int e) 9883d2307dSDag-Erling Smørgrav { 9983d2307dSDag-Erling Smørgrav extern int sys_nerr; 10083d2307dSDag-Erling Smørgrav extern char *sys_errlist[]; 10183d2307dSDag-Erling Smørgrav 10283d2307dSDag-Erling Smørgrav if ((e >= 0) && (e < sys_nerr)) 10383d2307dSDag-Erling Smørgrav return (sys_errlist[e]); 104d95e11bfSDag-Erling Smørgrav 10583d2307dSDag-Erling Smørgrav return ("unlisted error"); 10683d2307dSDag-Erling Smørgrav } 10783d2307dSDag-Erling Smørgrav #endif 10883d2307dSDag-Erling Smørgrav 10983d2307dSDag-Erling Smørgrav #ifndef HAVE_UTIMES 11083d2307dSDag-Erling Smørgrav int utimes(char *filename, struct timeval *tvp) 11183d2307dSDag-Erling Smørgrav { 11283d2307dSDag-Erling Smørgrav struct utimbuf ub; 11383d2307dSDag-Erling Smørgrav 1144b17dab0SDag-Erling Smørgrav ub.actime = tvp[0].tv_sec; 1154b17dab0SDag-Erling Smørgrav ub.modtime = tvp[1].tv_sec; 11683d2307dSDag-Erling Smørgrav 11783d2307dSDag-Erling Smørgrav return (utime(filename, &ub)); 11883d2307dSDag-Erling Smørgrav } 11983d2307dSDag-Erling Smørgrav #endif 12083d2307dSDag-Erling Smørgrav 121*19261079SEd Maste #ifndef HAVE_UTIMENSAT 122*19261079SEd Maste /* 123*19261079SEd Maste * A limited implementation of utimensat() that only implements the 124*19261079SEd Maste * functionality used by OpenSSH, currently only AT_FDCWD and 125*19261079SEd Maste * AT_SYMLINK_NOFOLLOW. 126*19261079SEd Maste */ 127*19261079SEd Maste int 128*19261079SEd Maste utimensat(int fd, const char *path, const struct timespec times[2], 129*19261079SEd Maste int flag) 130*19261079SEd Maste { 131*19261079SEd Maste struct timeval tv[2]; 132*19261079SEd Maste # ifdef HAVE_FUTIMES 133*19261079SEd Maste int ret, oflags = O_WRONLY; 134*19261079SEd Maste # endif 135*19261079SEd Maste 136*19261079SEd Maste tv[0].tv_sec = times[0].tv_sec; 137*19261079SEd Maste tv[0].tv_usec = times[0].tv_nsec / 1000; 138*19261079SEd Maste tv[1].tv_sec = times[1].tv_sec; 139*19261079SEd Maste tv[1].tv_usec = times[1].tv_nsec / 1000; 140*19261079SEd Maste 141*19261079SEd Maste if (fd != AT_FDCWD) { 142*19261079SEd Maste errno = ENOSYS; 143*19261079SEd Maste return -1; 144*19261079SEd Maste } 145*19261079SEd Maste # ifndef HAVE_FUTIMES 146*19261079SEd Maste return utimes(path, tv); 147*19261079SEd Maste # else 148*19261079SEd Maste # ifdef O_NOFOLLOW 149*19261079SEd Maste if (flag & AT_SYMLINK_NOFOLLOW) 150*19261079SEd Maste oflags |= O_NOFOLLOW; 151*19261079SEd Maste # endif /* O_NOFOLLOW */ 152*19261079SEd Maste if ((fd = open(path, oflags)) == -1) 153*19261079SEd Maste return -1; 154*19261079SEd Maste ret = futimes(fd, tv); 155*19261079SEd Maste close(fd); 156*19261079SEd Maste return ret; 157*19261079SEd Maste # endif 158*19261079SEd Maste } 159*19261079SEd Maste #endif 160*19261079SEd Maste 161*19261079SEd Maste #ifndef HAVE_FCHOWNAT 162*19261079SEd Maste /* 163*19261079SEd Maste * A limited implementation of fchownat() that only implements the 164*19261079SEd Maste * functionality used by OpenSSH, currently only AT_FDCWD and 165*19261079SEd Maste * AT_SYMLINK_NOFOLLOW. 166*19261079SEd Maste */ 167*19261079SEd Maste int 168*19261079SEd Maste fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag) 169*19261079SEd Maste { 170*19261079SEd Maste int ret, oflags = O_WRONLY; 171*19261079SEd Maste 172*19261079SEd Maste if (fd != AT_FDCWD) { 173*19261079SEd Maste errno = ENOSYS; 174*19261079SEd Maste return -1; 175*19261079SEd Maste } 176*19261079SEd Maste # ifndef HAVE_FCHOWN 177*19261079SEd Maste return chown(path, owner, group); 178*19261079SEd Maste # else 179*19261079SEd Maste # ifdef O_NOFOLLOW 180*19261079SEd Maste if (flag & AT_SYMLINK_NOFOLLOW) 181*19261079SEd Maste oflags |= O_NOFOLLOW; 182*19261079SEd Maste # endif /* O_NOFOLLOW */ 183*19261079SEd Maste if ((fd = open(path, oflags)) == -1) 184*19261079SEd Maste return -1; 185*19261079SEd Maste ret = fchown(fd, owner, group); 186*19261079SEd Maste close(fd); 187*19261079SEd Maste return ret; 188*19261079SEd Maste # endif 189*19261079SEd Maste } 190*19261079SEd Maste #endif 191*19261079SEd Maste 192*19261079SEd Maste #ifndef HAVE_FCHMODAT 193*19261079SEd Maste /* 194*19261079SEd Maste * A limited implementation of fchmodat() that only implements the 195*19261079SEd Maste * functionality used by OpenSSH, currently only AT_FDCWD and 196*19261079SEd Maste * AT_SYMLINK_NOFOLLOW. 197*19261079SEd Maste */ 198*19261079SEd Maste int 199*19261079SEd Maste fchmodat(int fd, const char *path, mode_t mode, int flag) 200*19261079SEd Maste { 201*19261079SEd Maste int ret, oflags = O_WRONLY; 202*19261079SEd Maste 203*19261079SEd Maste if (fd != AT_FDCWD) { 204*19261079SEd Maste errno = ENOSYS; 205*19261079SEd Maste return -1; 206*19261079SEd Maste } 207*19261079SEd Maste # ifndef HAVE_FCHMOD 208*19261079SEd Maste return chmod(path, mode); 209*19261079SEd Maste # else 210*19261079SEd Maste # ifdef O_NOFOLLOW 211*19261079SEd Maste if (flag & AT_SYMLINK_NOFOLLOW) 212*19261079SEd Maste oflags |= O_NOFOLLOW; 213*19261079SEd Maste # endif /* O_NOFOLLOW */ 214*19261079SEd Maste if ((fd = open(path, oflags)) == -1) 215*19261079SEd Maste return -1; 216*19261079SEd Maste ret = fchmod(fd, mode); 217*19261079SEd Maste close(fd); 218*19261079SEd Maste return ret; 219*19261079SEd Maste # endif 220*19261079SEd Maste } 221*19261079SEd Maste #endif 222*19261079SEd Maste 22383d2307dSDag-Erling Smørgrav #ifndef HAVE_TRUNCATE 22483d2307dSDag-Erling Smørgrav int truncate(const char *path, off_t length) 22583d2307dSDag-Erling Smørgrav { 22683d2307dSDag-Erling Smørgrav int fd, ret, saverrno; 22783d2307dSDag-Erling Smørgrav 22883d2307dSDag-Erling Smørgrav fd = open(path, O_WRONLY); 22983d2307dSDag-Erling Smørgrav if (fd < 0) 230d95e11bfSDag-Erling Smørgrav return (-1); 23183d2307dSDag-Erling Smørgrav 23283d2307dSDag-Erling Smørgrav ret = ftruncate(fd, length); 23383d2307dSDag-Erling Smørgrav saverrno = errno; 234d95e11bfSDag-Erling Smørgrav close(fd); 23583d2307dSDag-Erling Smørgrav if (ret == -1) 23683d2307dSDag-Erling Smørgrav errno = saverrno; 237d95e11bfSDag-Erling Smørgrav 23883d2307dSDag-Erling Smørgrav return(ret); 23983d2307dSDag-Erling Smørgrav } 24083d2307dSDag-Erling Smørgrav #endif /* HAVE_TRUNCATE */ 24183d2307dSDag-Erling Smørgrav 242d0c8c0bcSDag-Erling Smørgrav #if !defined(HAVE_NANOSLEEP) && !defined(HAVE_NSLEEP) 243d0c8c0bcSDag-Erling Smørgrav int nanosleep(const struct timespec *req, struct timespec *rem) 244d0c8c0bcSDag-Erling Smørgrav { 245d0c8c0bcSDag-Erling Smørgrav int rc, saverrno; 246d0c8c0bcSDag-Erling Smørgrav extern int errno; 247d0c8c0bcSDag-Erling Smørgrav struct timeval tstart, tstop, tremain, time2wait; 248d0c8c0bcSDag-Erling Smørgrav 249d0c8c0bcSDag-Erling Smørgrav TIMESPEC_TO_TIMEVAL(&time2wait, req) 250d0c8c0bcSDag-Erling Smørgrav (void) gettimeofday(&tstart, NULL); 251d0c8c0bcSDag-Erling Smørgrav rc = select(0, NULL, NULL, NULL, &time2wait); 252d0c8c0bcSDag-Erling Smørgrav if (rc == -1) { 253d0c8c0bcSDag-Erling Smørgrav saverrno = errno; 254d0c8c0bcSDag-Erling Smørgrav (void) gettimeofday (&tstop, NULL); 255d0c8c0bcSDag-Erling Smørgrav errno = saverrno; 256d0c8c0bcSDag-Erling Smørgrav tremain.tv_sec = time2wait.tv_sec - 257d0c8c0bcSDag-Erling Smørgrav (tstop.tv_sec - tstart.tv_sec); 258d0c8c0bcSDag-Erling Smørgrav tremain.tv_usec = time2wait.tv_usec - 259d0c8c0bcSDag-Erling Smørgrav (tstop.tv_usec - tstart.tv_usec); 260d0c8c0bcSDag-Erling Smørgrav tremain.tv_sec += tremain.tv_usec / 1000000L; 261d0c8c0bcSDag-Erling Smørgrav tremain.tv_usec %= 1000000L; 262d0c8c0bcSDag-Erling Smørgrav } else { 263d0c8c0bcSDag-Erling Smørgrav tremain.tv_sec = 0; 264d0c8c0bcSDag-Erling Smørgrav tremain.tv_usec = 0; 265d0c8c0bcSDag-Erling Smørgrav } 266d4af9e69SDag-Erling Smørgrav if (rem != NULL) 267d0c8c0bcSDag-Erling Smørgrav TIMEVAL_TO_TIMESPEC(&tremain, rem) 268d0c8c0bcSDag-Erling Smørgrav 269d0c8c0bcSDag-Erling Smørgrav return(rc); 270d0c8c0bcSDag-Erling Smørgrav } 271d0c8c0bcSDag-Erling Smørgrav #endif 272d0c8c0bcSDag-Erling Smørgrav 2736888a9beSDag-Erling Smørgrav #if !defined(HAVE_USLEEP) 2746888a9beSDag-Erling Smørgrav int usleep(unsigned int useconds) 2756888a9beSDag-Erling Smørgrav { 2766888a9beSDag-Erling Smørgrav struct timespec ts; 2776888a9beSDag-Erling Smørgrav 2786888a9beSDag-Erling Smørgrav ts.tv_sec = useconds / 1000000; 2796888a9beSDag-Erling Smørgrav ts.tv_nsec = (useconds % 1000000) * 1000; 2806888a9beSDag-Erling Smørgrav return nanosleep(&ts, NULL); 2816888a9beSDag-Erling Smørgrav } 2826888a9beSDag-Erling Smørgrav #endif 2836888a9beSDag-Erling Smørgrav 284d95e11bfSDag-Erling Smørgrav #ifndef HAVE_TCGETPGRP 285d95e11bfSDag-Erling Smørgrav pid_t 286d95e11bfSDag-Erling Smørgrav tcgetpgrp(int fd) 287d95e11bfSDag-Erling Smørgrav { 288d95e11bfSDag-Erling Smørgrav int ctty_pgrp; 289d95e11bfSDag-Erling Smørgrav 290d95e11bfSDag-Erling Smørgrav if (ioctl(fd, TIOCGPGRP, &ctty_pgrp) == -1) 291d95e11bfSDag-Erling Smørgrav return(-1); 292d95e11bfSDag-Erling Smørgrav else 293d95e11bfSDag-Erling Smørgrav return(ctty_pgrp); 294d95e11bfSDag-Erling Smørgrav } 295d95e11bfSDag-Erling Smørgrav #endif /* HAVE_TCGETPGRP */ 296d95e11bfSDag-Erling Smørgrav 297d95e11bfSDag-Erling Smørgrav #ifndef HAVE_TCSENDBREAK 298d95e11bfSDag-Erling Smørgrav int 299d95e11bfSDag-Erling Smørgrav tcsendbreak(int fd, int duration) 300d95e11bfSDag-Erling Smørgrav { 301d95e11bfSDag-Erling Smørgrav # if defined(TIOCSBRK) && defined(TIOCCBRK) 302d95e11bfSDag-Erling Smørgrav struct timeval sleepytime; 303d95e11bfSDag-Erling Smørgrav 304d95e11bfSDag-Erling Smørgrav sleepytime.tv_sec = 0; 305d95e11bfSDag-Erling Smørgrav sleepytime.tv_usec = 400000; 306d95e11bfSDag-Erling Smørgrav if (ioctl(fd, TIOCSBRK, 0) == -1) 307d95e11bfSDag-Erling Smørgrav return (-1); 308d95e11bfSDag-Erling Smørgrav (void)select(0, 0, 0, 0, &sleepytime); 309d95e11bfSDag-Erling Smørgrav if (ioctl(fd, TIOCCBRK, 0) == -1) 310d95e11bfSDag-Erling Smørgrav return (-1); 311d95e11bfSDag-Erling Smørgrav return (0); 312d95e11bfSDag-Erling Smørgrav # else 313d95e11bfSDag-Erling Smørgrav return -1; 314d95e11bfSDag-Erling Smørgrav # endif 315d95e11bfSDag-Erling Smørgrav } 316d95e11bfSDag-Erling Smørgrav #endif /* HAVE_TCSENDBREAK */ 317d95e11bfSDag-Erling Smørgrav 318043840dfSDag-Erling Smørgrav #ifndef HAVE_STRDUP 319043840dfSDag-Erling Smørgrav char * 320043840dfSDag-Erling Smørgrav strdup(const char *str) 321043840dfSDag-Erling Smørgrav { 322043840dfSDag-Erling Smørgrav size_t len; 323043840dfSDag-Erling Smørgrav char *cp; 324043840dfSDag-Erling Smørgrav 325043840dfSDag-Erling Smørgrav len = strlen(str) + 1; 326043840dfSDag-Erling Smørgrav cp = malloc(len); 327043840dfSDag-Erling Smørgrav if (cp != NULL) 328021d409fSDag-Erling Smørgrav return(memcpy(cp, str, len)); 329043840dfSDag-Erling Smørgrav return NULL; 330043840dfSDag-Erling Smørgrav } 331043840dfSDag-Erling Smørgrav #endif 3324a421b63SDag-Erling Smørgrav 3334a421b63SDag-Erling Smørgrav #ifndef HAVE_ISBLANK 3346888a9beSDag-Erling Smørgrav int 3356888a9beSDag-Erling Smørgrav isblank(int c) 3364a421b63SDag-Erling Smørgrav { 3374a421b63SDag-Erling Smørgrav return (c == ' ' || c == '\t'); 3384a421b63SDag-Erling Smørgrav } 3394a421b63SDag-Erling Smørgrav #endif 3406888a9beSDag-Erling Smørgrav 3416888a9beSDag-Erling Smørgrav #ifndef HAVE_GETPGID 3426888a9beSDag-Erling Smørgrav pid_t 3436888a9beSDag-Erling Smørgrav getpgid(pid_t pid) 3446888a9beSDag-Erling Smørgrav { 34547dd1d1bSDag-Erling Smørgrav #if defined(HAVE_GETPGRP) && !defined(GETPGRP_VOID) && GETPGRP_VOID == 0 3466888a9beSDag-Erling Smørgrav return getpgrp(pid); 3476888a9beSDag-Erling Smørgrav #elif defined(HAVE_GETPGRP) 3486888a9beSDag-Erling Smørgrav if (pid == 0) 3496888a9beSDag-Erling Smørgrav return getpgrp(); 3506888a9beSDag-Erling Smørgrav #endif 3516888a9beSDag-Erling Smørgrav 3526888a9beSDag-Erling Smørgrav errno = ESRCH; 3536888a9beSDag-Erling Smørgrav return -1; 3546888a9beSDag-Erling Smørgrav } 3556888a9beSDag-Erling Smørgrav #endif 356acc1a9efSDag-Erling Smørgrav 357acc1a9efSDag-Erling Smørgrav #ifndef HAVE_PLEDGE 358acc1a9efSDag-Erling Smørgrav int 359acc1a9efSDag-Erling Smørgrav pledge(const char *promises, const char *paths[]) 360acc1a9efSDag-Erling Smørgrav { 361acc1a9efSDag-Erling Smørgrav return 0; 362acc1a9efSDag-Erling Smørgrav } 363acc1a9efSDag-Erling Smørgrav #endif 364076ad2f8SDag-Erling Smørgrav 365076ad2f8SDag-Erling Smørgrav #ifndef HAVE_MBTOWC 366076ad2f8SDag-Erling Smørgrav /* a mbtowc that only supports ASCII */ 367076ad2f8SDag-Erling Smørgrav int 368076ad2f8SDag-Erling Smørgrav mbtowc(wchar_t *pwc, const char *s, size_t n) 369076ad2f8SDag-Erling Smørgrav { 370076ad2f8SDag-Erling Smørgrav if (s == NULL || *s == '\0') 371076ad2f8SDag-Erling Smørgrav return 0; /* ASCII is not state-dependent */ 372076ad2f8SDag-Erling Smørgrav if (*s < 0 || *s > 0x7f || n < 1) { 373076ad2f8SDag-Erling Smørgrav errno = EOPNOTSUPP; 374076ad2f8SDag-Erling Smørgrav return -1; 375076ad2f8SDag-Erling Smørgrav } 376076ad2f8SDag-Erling Smørgrav if (pwc != NULL) 377076ad2f8SDag-Erling Smørgrav *pwc = *s; 378076ad2f8SDag-Erling Smørgrav return 1; 379076ad2f8SDag-Erling Smørgrav } 380076ad2f8SDag-Erling Smørgrav #endif 381d93a896eSDag-Erling Smørgrav 382d93a896eSDag-Erling Smørgrav #ifndef HAVE_LLABS 383d93a896eSDag-Erling Smørgrav long long 384d93a896eSDag-Erling Smørgrav llabs(long long j) 385d93a896eSDag-Erling Smørgrav { 386d93a896eSDag-Erling Smørgrav return (j < 0 ? -j : j); 387d93a896eSDag-Erling Smørgrav } 388d93a896eSDag-Erling Smørgrav #endif 38947dd1d1bSDag-Erling Smørgrav 39047dd1d1bSDag-Erling Smørgrav #ifndef HAVE_BZERO 39147dd1d1bSDag-Erling Smørgrav void 39247dd1d1bSDag-Erling Smørgrav bzero(void *b, size_t n) 39347dd1d1bSDag-Erling Smørgrav { 39447dd1d1bSDag-Erling Smørgrav (void)memset(b, 0, n); 39547dd1d1bSDag-Erling Smørgrav } 39647dd1d1bSDag-Erling Smørgrav #endif 39747dd1d1bSDag-Erling Smørgrav 39847dd1d1bSDag-Erling Smørgrav #ifndef HAVE_RAISE 39947dd1d1bSDag-Erling Smørgrav int 40047dd1d1bSDag-Erling Smørgrav raise(int sig) 40147dd1d1bSDag-Erling Smørgrav { 40247dd1d1bSDag-Erling Smørgrav kill(getpid(), sig); 40347dd1d1bSDag-Erling Smørgrav } 40447dd1d1bSDag-Erling Smørgrav #endif 40547dd1d1bSDag-Erling Smørgrav 40647dd1d1bSDag-Erling Smørgrav #ifndef HAVE_GETSID 40747dd1d1bSDag-Erling Smørgrav pid_t 40847dd1d1bSDag-Erling Smørgrav getsid(pid_t pid) 40947dd1d1bSDag-Erling Smørgrav { 41047dd1d1bSDag-Erling Smørgrav errno = ENOSYS; 41147dd1d1bSDag-Erling Smørgrav return -1; 41247dd1d1bSDag-Erling Smørgrav } 41347dd1d1bSDag-Erling Smørgrav #endif 41447dd1d1bSDag-Erling Smørgrav 41547dd1d1bSDag-Erling Smørgrav #ifdef FFLUSH_NULL_BUG 41647dd1d1bSDag-Erling Smørgrav #undef fflush 41747dd1d1bSDag-Erling Smørgrav int _ssh_compat_fflush(FILE *f) 41847dd1d1bSDag-Erling Smørgrav { 4192f513db7SEd Maste int r1, r2; 42047dd1d1bSDag-Erling Smørgrav 42147dd1d1bSDag-Erling Smørgrav if (f == NULL) { 4222f513db7SEd Maste r1 = fflush(stdout); 4232f513db7SEd Maste r2 = fflush(stderr); 4242f513db7SEd Maste if (r1 == -1 || r2 == -1) 42547dd1d1bSDag-Erling Smørgrav return -1; 42647dd1d1bSDag-Erling Smørgrav return 0; 42747dd1d1bSDag-Erling Smørgrav } 42847dd1d1bSDag-Erling Smørgrav return fflush(f); 42947dd1d1bSDag-Erling Smørgrav } 43047dd1d1bSDag-Erling Smørgrav #endif 431*19261079SEd Maste 432*19261079SEd Maste #ifndef HAVE_LOCALTIME_R 433*19261079SEd Maste struct tm * 434*19261079SEd Maste localtime_r(const time_t *timep, struct tm *result) 435*19261079SEd Maste { 436*19261079SEd Maste struct tm *tm = localtime(timep); 437*19261079SEd Maste *result = *tm; 438*19261079SEd Maste return result; 439*19261079SEd Maste } 440*19261079SEd Maste #endif 441