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
2819261079SEd 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 */
ssh_get_progname(char * argv0)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
setlogin(const char * name)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
innetgr(const char * netgroup,const char * host,const char * user,const char * domain)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)
seteuid(uid_t euid)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)
setegid(uid_t egid)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)
strerror(int e)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
utimes(const char * filename,struct timeval * tvp)11087c1498dSEd Maste int utimes(const 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
12119261079SEd Maste #ifndef HAVE_UTIMENSAT
12219261079SEd Maste /*
12319261079SEd Maste * A limited implementation of utimensat() that only implements the
12419261079SEd Maste * functionality used by OpenSSH, currently only AT_FDCWD and
12519261079SEd Maste * AT_SYMLINK_NOFOLLOW.
12619261079SEd Maste */
12719261079SEd Maste int
utimensat(int fd,const char * path,const struct timespec times[2],int flag)12819261079SEd Maste utimensat(int fd, const char *path, const struct timespec times[2],
12919261079SEd Maste int flag)
13019261079SEd Maste {
13119261079SEd Maste struct timeval tv[2];
13219261079SEd Maste # ifdef HAVE_FUTIMES
13319261079SEd Maste int ret, oflags = O_WRONLY;
13419261079SEd Maste # endif
13519261079SEd Maste
13619261079SEd Maste tv[0].tv_sec = times[0].tv_sec;
13719261079SEd Maste tv[0].tv_usec = times[0].tv_nsec / 1000;
13819261079SEd Maste tv[1].tv_sec = times[1].tv_sec;
13919261079SEd Maste tv[1].tv_usec = times[1].tv_nsec / 1000;
14019261079SEd Maste
14119261079SEd Maste if (fd != AT_FDCWD) {
14219261079SEd Maste errno = ENOSYS;
14319261079SEd Maste return -1;
14419261079SEd Maste }
14519261079SEd Maste # ifndef HAVE_FUTIMES
14619261079SEd Maste return utimes(path, tv);
14719261079SEd Maste # else
14819261079SEd Maste # ifdef O_NOFOLLOW
14919261079SEd Maste if (flag & AT_SYMLINK_NOFOLLOW)
15019261079SEd Maste oflags |= O_NOFOLLOW;
15119261079SEd Maste # endif /* O_NOFOLLOW */
15219261079SEd Maste if ((fd = open(path, oflags)) == -1)
15319261079SEd Maste return -1;
15419261079SEd Maste ret = futimes(fd, tv);
15519261079SEd Maste close(fd);
15619261079SEd Maste return ret;
15719261079SEd Maste # endif
15819261079SEd Maste }
15919261079SEd Maste #endif
16019261079SEd Maste
16119261079SEd Maste #ifndef HAVE_FCHOWNAT
16219261079SEd Maste /*
16319261079SEd Maste * A limited implementation of fchownat() that only implements the
16419261079SEd Maste * functionality used by OpenSSH, currently only AT_FDCWD and
16519261079SEd Maste * AT_SYMLINK_NOFOLLOW.
16619261079SEd Maste */
16719261079SEd Maste int
fchownat(int fd,const char * path,uid_t owner,gid_t group,int flag)16819261079SEd Maste fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag)
16919261079SEd Maste {
17019261079SEd Maste int ret, oflags = O_WRONLY;
17119261079SEd Maste
17219261079SEd Maste if (fd != AT_FDCWD) {
17319261079SEd Maste errno = ENOSYS;
17419261079SEd Maste return -1;
17519261079SEd Maste }
17619261079SEd Maste # ifndef HAVE_FCHOWN
17719261079SEd Maste return chown(path, owner, group);
17819261079SEd Maste # else
17919261079SEd Maste # ifdef O_NOFOLLOW
18019261079SEd Maste if (flag & AT_SYMLINK_NOFOLLOW)
18119261079SEd Maste oflags |= O_NOFOLLOW;
18219261079SEd Maste # endif /* O_NOFOLLOW */
18319261079SEd Maste if ((fd = open(path, oflags)) == -1)
18419261079SEd Maste return -1;
18519261079SEd Maste ret = fchown(fd, owner, group);
18619261079SEd Maste close(fd);
18719261079SEd Maste return ret;
18819261079SEd Maste # endif
18919261079SEd Maste }
19019261079SEd Maste #endif
19119261079SEd Maste
19219261079SEd Maste #ifndef HAVE_FCHMODAT
19319261079SEd Maste /*
19419261079SEd Maste * A limited implementation of fchmodat() that only implements the
19519261079SEd Maste * functionality used by OpenSSH, currently only AT_FDCWD and
19619261079SEd Maste * AT_SYMLINK_NOFOLLOW.
19719261079SEd Maste */
19819261079SEd Maste int
fchmodat(int fd,const char * path,mode_t mode,int flag)19919261079SEd Maste fchmodat(int fd, const char *path, mode_t mode, int flag)
20019261079SEd Maste {
20119261079SEd Maste int ret, oflags = O_WRONLY;
20219261079SEd Maste
20319261079SEd Maste if (fd != AT_FDCWD) {
20419261079SEd Maste errno = ENOSYS;
20519261079SEd Maste return -1;
20619261079SEd Maste }
20719261079SEd Maste # ifndef HAVE_FCHMOD
20819261079SEd Maste return chmod(path, mode);
20919261079SEd Maste # else
21019261079SEd Maste # ifdef O_NOFOLLOW
21119261079SEd Maste if (flag & AT_SYMLINK_NOFOLLOW)
21219261079SEd Maste oflags |= O_NOFOLLOW;
21319261079SEd Maste # endif /* O_NOFOLLOW */
21419261079SEd Maste if ((fd = open(path, oflags)) == -1)
21519261079SEd Maste return -1;
21619261079SEd Maste ret = fchmod(fd, mode);
21719261079SEd Maste close(fd);
21819261079SEd Maste return ret;
21919261079SEd Maste # endif
22019261079SEd Maste }
22119261079SEd Maste #endif
22219261079SEd Maste
22383d2307dSDag-Erling Smørgrav #ifndef HAVE_TRUNCATE
truncate(const char * path,off_t length)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)
nanosleep(const struct timespec * req,struct timespec * rem)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)
usleep(unsigned int useconds)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
tcgetpgrp(int fd)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
tcsendbreak(int fd,int duration)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 *
strdup(const char * str)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
isblank(int c)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
getpgid(pid_t pid)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
pledge(const char * promises,const char * paths[])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
mbtowc(wchar_t * pwc,const char * s,size_t n)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
llabs(long long j)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
bzero(void * b,size_t n)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
raise(int sig)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
getsid(pid_t pid)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
41587c1498dSEd Maste #ifndef HAVE_KILLPG
41687c1498dSEd Maste int
killpg(pid_t pgrp,int sig)41787c1498dSEd Maste killpg(pid_t pgrp, int sig)
41887c1498dSEd Maste {
41987c1498dSEd Maste return kill(pgrp, sig);
42087c1498dSEd Maste }
42187c1498dSEd Maste #endif
42287c1498dSEd Maste
42347dd1d1bSDag-Erling Smørgrav #ifdef FFLUSH_NULL_BUG
42447dd1d1bSDag-Erling Smørgrav #undef fflush
_ssh_compat_fflush(FILE * f)42547dd1d1bSDag-Erling Smørgrav int _ssh_compat_fflush(FILE *f)
42647dd1d1bSDag-Erling Smørgrav {
4272f513db7SEd Maste int r1, r2;
42847dd1d1bSDag-Erling Smørgrav
42947dd1d1bSDag-Erling Smørgrav if (f == NULL) {
4302f513db7SEd Maste r1 = fflush(stdout);
4312f513db7SEd Maste r2 = fflush(stderr);
4322f513db7SEd Maste if (r1 == -1 || r2 == -1)
43347dd1d1bSDag-Erling Smørgrav return -1;
43447dd1d1bSDag-Erling Smørgrav return 0;
43547dd1d1bSDag-Erling Smørgrav }
43647dd1d1bSDag-Erling Smørgrav return fflush(f);
43747dd1d1bSDag-Erling Smørgrav }
43847dd1d1bSDag-Erling Smørgrav #endif
43919261079SEd Maste
44019261079SEd Maste #ifndef HAVE_LOCALTIME_R
44119261079SEd Maste struct tm *
localtime_r(const time_t * timep,struct tm * result)44219261079SEd Maste localtime_r(const time_t *timep, struct tm *result)
44319261079SEd Maste {
44419261079SEd Maste struct tm *tm = localtime(timep);
44519261079SEd Maste *result = *tm;
44619261079SEd Maste return result;
44719261079SEd Maste }
44819261079SEd Maste #endif
449*38a52bd3SEd Maste
450*38a52bd3SEd Maste #ifdef ASAN_OPTIONS
__asan_default_options(void)451*38a52bd3SEd Maste const char *__asan_default_options(void) {
452*38a52bd3SEd Maste return ASAN_OPTIONS;
453*38a52bd3SEd Maste }
454*38a52bd3SEd Maste #endif
455*38a52bd3SEd Maste
456*38a52bd3SEd Maste #ifdef MSAN_OPTIONS
__msan_default_options(void)457*38a52bd3SEd Maste const char *__msan_default_options(void) {
458*38a52bd3SEd Maste return MSAN_OPTIONS;
459*38a52bd3SEd Maste }
460*38a52bd3SEd Maste #endif
461