xref: /dflybsd-src/lib/libssh/openbsd-compat/bsd-misc.c (revision 2c81fb9c483cc2c8f293c3c199fac04d266b4e1b)
12c0338ffSzrj 
22c0338ffSzrj /*
32c0338ffSzrj  * Copyright (c) 1999-2004 Damien Miller <djm@mindrot.org>
42c0338ffSzrj  *
52c0338ffSzrj  * Permission to use, copy, modify, and distribute this software for any
62c0338ffSzrj  * purpose with or without fee is hereby granted, provided that the above
72c0338ffSzrj  * copyright notice and this permission notice appear in all copies.
82c0338ffSzrj  *
92c0338ffSzrj  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
102c0338ffSzrj  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
112c0338ffSzrj  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
122c0338ffSzrj  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
132c0338ffSzrj  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
142c0338ffSzrj  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
152c0338ffSzrj  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
162c0338ffSzrj  */
172c0338ffSzrj 
182c0338ffSzrj #include "includes.h"
192c0338ffSzrj 
202c0338ffSzrj #include <sys/types.h>
21bc9cc675SDaniel Fojt #ifdef HAVE_SYS_SELECT_H
222c0338ffSzrj # include <sys/select.h>
23bc9cc675SDaniel Fojt #endif
24bc9cc675SDaniel Fojt #ifdef HAVE_SYS_TIME_H
252c0338ffSzrj # include <sys/time.h>
26bc9cc675SDaniel Fojt #endif
272c0338ffSzrj 
282c0338ffSzrj #include <fcntl.h>
292c0338ffSzrj #include <string.h>
302c0338ffSzrj #include <signal.h>
312c0338ffSzrj #include <stdlib.h>
322c0338ffSzrj #include <stdio.h>
332c0338ffSzrj #include <time.h>
342c0338ffSzrj #include <unistd.h>
352c0338ffSzrj 
36bc9cc675SDaniel Fojt #ifndef HAVE___PROGNAME
37bc9cc675SDaniel Fojt char *__progname;
38bc9cc675SDaniel Fojt #endif
39bc9cc675SDaniel Fojt 
402c0338ffSzrj /*
412c0338ffSzrj  * NB. duplicate __progname in case it is an alias for argv[0]
422c0338ffSzrj  * Otherwise it may get clobbered by setproctitle()
432c0338ffSzrj  */
ssh_get_progname(char * argv0)442c0338ffSzrj char *ssh_get_progname(char *argv0)
452c0338ffSzrj {
462c0338ffSzrj 	char *p, *q;
47bc9cc675SDaniel Fojt #ifdef HAVE___PROGNAME
482c0338ffSzrj 	extern char *__progname;
492c0338ffSzrj 
502c0338ffSzrj 	p = __progname;
51bc9cc675SDaniel Fojt #else
52bc9cc675SDaniel Fojt 	if (argv0 == NULL)
53bc9cc675SDaniel Fojt 		return ("unknown");	/* XXX */
54bc9cc675SDaniel Fojt 	p = strrchr(argv0, '/');
55bc9cc675SDaniel Fojt 	if (p == NULL)
56bc9cc675SDaniel Fojt 		p = argv0;
57bc9cc675SDaniel Fojt 	else
58bc9cc675SDaniel Fojt 		p++;
59bc9cc675SDaniel Fojt #endif
602c0338ffSzrj 	if ((q = strdup(p)) == NULL) {
612c0338ffSzrj 		perror("strdup");
622c0338ffSzrj 		exit(1);
632c0338ffSzrj 	}
642c0338ffSzrj 	return q;
652c0338ffSzrj }
662c0338ffSzrj 
67*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_SETLOGIN
setlogin(const char * name)68*2c81fb9cSAntonio Huete Jimenez int setlogin(const char *name)
69*2c81fb9cSAntonio Huete Jimenez {
70*2c81fb9cSAntonio Huete Jimenez 	return (0);
71*2c81fb9cSAntonio Huete Jimenez }
72*2c81fb9cSAntonio Huete Jimenez #endif /* !HAVE_SETLOGIN */
73*2c81fb9cSAntonio Huete Jimenez 
74*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_INNETGR
innetgr(const char * netgroup,const char * host,const char * user,const char * domain)75*2c81fb9cSAntonio Huete Jimenez int innetgr(const char *netgroup, const char *host,
76*2c81fb9cSAntonio Huete Jimenez 	    const char *user, const char *domain)
77*2c81fb9cSAntonio Huete Jimenez {
78*2c81fb9cSAntonio Huete Jimenez 	return (0);
79*2c81fb9cSAntonio Huete Jimenez }
80*2c81fb9cSAntonio Huete Jimenez #endif /* HAVE_INNETGR */
81*2c81fb9cSAntonio Huete Jimenez 
82*2c81fb9cSAntonio Huete Jimenez #if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID)
seteuid(uid_t euid)83*2c81fb9cSAntonio Huete Jimenez int seteuid(uid_t euid)
84*2c81fb9cSAntonio Huete Jimenez {
85*2c81fb9cSAntonio Huete Jimenez 	return (setreuid(-1, euid));
86*2c81fb9cSAntonio Huete Jimenez }
87*2c81fb9cSAntonio Huete Jimenez #endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */
88*2c81fb9cSAntonio Huete Jimenez 
89*2c81fb9cSAntonio Huete Jimenez #if !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID)
setegid(uid_t egid)90*2c81fb9cSAntonio Huete Jimenez int setegid(uid_t egid)
91*2c81fb9cSAntonio Huete Jimenez {
92*2c81fb9cSAntonio Huete Jimenez 	return(setresgid(-1, egid, -1));
93*2c81fb9cSAntonio Huete Jimenez }
94*2c81fb9cSAntonio Huete Jimenez #endif /* !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) */
95*2c81fb9cSAntonio Huete Jimenez 
96*2c81fb9cSAntonio Huete Jimenez #if !defined(HAVE_STRERROR) && defined(HAVE_SYS_ERRLIST) && defined(HAVE_SYS_NERR)
strerror(int e)97*2c81fb9cSAntonio Huete Jimenez const char *strerror(int e)
98*2c81fb9cSAntonio Huete Jimenez {
99*2c81fb9cSAntonio Huete Jimenez 	extern int sys_nerr;
100*2c81fb9cSAntonio Huete Jimenez 	extern char *sys_errlist[];
101*2c81fb9cSAntonio Huete Jimenez 
102*2c81fb9cSAntonio Huete Jimenez 	if ((e >= 0) && (e < sys_nerr))
103*2c81fb9cSAntonio Huete Jimenez 		return (sys_errlist[e]);
104*2c81fb9cSAntonio Huete Jimenez 
105*2c81fb9cSAntonio Huete Jimenez 	return ("unlisted error");
106*2c81fb9cSAntonio Huete Jimenez }
107*2c81fb9cSAntonio Huete Jimenez #endif
108*2c81fb9cSAntonio Huete Jimenez 
109*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_UTIMES
utimes(const char * filename,struct timeval * tvp)110*2c81fb9cSAntonio Huete Jimenez int utimes(const char *filename, struct timeval *tvp)
111*2c81fb9cSAntonio Huete Jimenez {
112*2c81fb9cSAntonio Huete Jimenez 	struct utimbuf ub;
113*2c81fb9cSAntonio Huete Jimenez 
114*2c81fb9cSAntonio Huete Jimenez 	ub.actime = tvp[0].tv_sec;
115*2c81fb9cSAntonio Huete Jimenez 	ub.modtime = tvp[1].tv_sec;
116*2c81fb9cSAntonio Huete Jimenez 
117*2c81fb9cSAntonio Huete Jimenez 	return (utime(filename, &ub));
118*2c81fb9cSAntonio Huete Jimenez }
119*2c81fb9cSAntonio Huete Jimenez #endif
120*2c81fb9cSAntonio Huete Jimenez 
121*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_UTIMENSAT
122*2c81fb9cSAntonio Huete Jimenez /*
123*2c81fb9cSAntonio Huete Jimenez  * A limited implementation of utimensat() that only implements the
124*2c81fb9cSAntonio Huete Jimenez  * functionality used by OpenSSH, currently only AT_FDCWD and
125*2c81fb9cSAntonio Huete Jimenez  * AT_SYMLINK_NOFOLLOW.
126*2c81fb9cSAntonio Huete Jimenez  */
127*2c81fb9cSAntonio Huete Jimenez int
utimensat(int fd,const char * path,const struct timespec times[2],int flag)128*2c81fb9cSAntonio Huete Jimenez utimensat(int fd, const char *path, const struct timespec times[2],
129*2c81fb9cSAntonio Huete Jimenez     int flag)
130*2c81fb9cSAntonio Huete Jimenez {
131*2c81fb9cSAntonio Huete Jimenez 	struct timeval tv[2];
132*2c81fb9cSAntonio Huete Jimenez # ifdef HAVE_FUTIMES
133*2c81fb9cSAntonio Huete Jimenez 	int ret, oflags = O_WRONLY;
134*2c81fb9cSAntonio Huete Jimenez # endif
135*2c81fb9cSAntonio Huete Jimenez 
136*2c81fb9cSAntonio Huete Jimenez 	tv[0].tv_sec = times[0].tv_sec;
137*2c81fb9cSAntonio Huete Jimenez 	tv[0].tv_usec = times[0].tv_nsec / 1000;
138*2c81fb9cSAntonio Huete Jimenez 	tv[1].tv_sec = times[1].tv_sec;
139*2c81fb9cSAntonio Huete Jimenez 	tv[1].tv_usec = times[1].tv_nsec / 1000;
140*2c81fb9cSAntonio Huete Jimenez 
141*2c81fb9cSAntonio Huete Jimenez 	if (fd != AT_FDCWD) {
142*2c81fb9cSAntonio Huete Jimenez 		errno = ENOSYS;
143*2c81fb9cSAntonio Huete Jimenez 		return -1;
144*2c81fb9cSAntonio Huete Jimenez 	}
145*2c81fb9cSAntonio Huete Jimenez # ifndef HAVE_FUTIMES
146*2c81fb9cSAntonio Huete Jimenez 	return utimes(path, tv);
147*2c81fb9cSAntonio Huete Jimenez # else
148*2c81fb9cSAntonio Huete Jimenez #  ifdef O_NOFOLLOW
149*2c81fb9cSAntonio Huete Jimenez 	if (flag & AT_SYMLINK_NOFOLLOW)
150*2c81fb9cSAntonio Huete Jimenez 		oflags |= O_NOFOLLOW;
151*2c81fb9cSAntonio Huete Jimenez #  endif /* O_NOFOLLOW */
152*2c81fb9cSAntonio Huete Jimenez 	if ((fd = open(path, oflags)) == -1)
153*2c81fb9cSAntonio Huete Jimenez 		return -1;
154*2c81fb9cSAntonio Huete Jimenez 	ret = futimes(fd, tv);
155*2c81fb9cSAntonio Huete Jimenez 	close(fd);
156*2c81fb9cSAntonio Huete Jimenez 	return ret;
157*2c81fb9cSAntonio Huete Jimenez # endif
158*2c81fb9cSAntonio Huete Jimenez }
159*2c81fb9cSAntonio Huete Jimenez #endif
160*2c81fb9cSAntonio Huete Jimenez 
161*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_FCHOWNAT
162*2c81fb9cSAntonio Huete Jimenez /*
163*2c81fb9cSAntonio Huete Jimenez  * A limited implementation of fchownat() that only implements the
164*2c81fb9cSAntonio Huete Jimenez  * functionality used by OpenSSH, currently only AT_FDCWD and
165*2c81fb9cSAntonio Huete Jimenez  * AT_SYMLINK_NOFOLLOW.
166*2c81fb9cSAntonio Huete Jimenez  */
167*2c81fb9cSAntonio Huete Jimenez int
fchownat(int fd,const char * path,uid_t owner,gid_t group,int flag)168*2c81fb9cSAntonio Huete Jimenez fchownat(int fd, const char *path, uid_t owner, gid_t group, int flag)
169*2c81fb9cSAntonio Huete Jimenez {
170*2c81fb9cSAntonio Huete Jimenez 	int ret, oflags = O_WRONLY;
171*2c81fb9cSAntonio Huete Jimenez 
172*2c81fb9cSAntonio Huete Jimenez 	if (fd != AT_FDCWD) {
173*2c81fb9cSAntonio Huete Jimenez 		errno = ENOSYS;
174*2c81fb9cSAntonio Huete Jimenez 		return -1;
175*2c81fb9cSAntonio Huete Jimenez 	}
176*2c81fb9cSAntonio Huete Jimenez # ifndef HAVE_FCHOWN
177*2c81fb9cSAntonio Huete Jimenez 	return chown(path, owner, group);
178*2c81fb9cSAntonio Huete Jimenez # else
179*2c81fb9cSAntonio Huete Jimenez #  ifdef O_NOFOLLOW
180*2c81fb9cSAntonio Huete Jimenez 	if (flag & AT_SYMLINK_NOFOLLOW)
181*2c81fb9cSAntonio Huete Jimenez 		oflags |= O_NOFOLLOW;
182*2c81fb9cSAntonio Huete Jimenez #  endif /* O_NOFOLLOW */
183*2c81fb9cSAntonio Huete Jimenez 	if ((fd = open(path, oflags)) == -1)
184*2c81fb9cSAntonio Huete Jimenez 		return -1;
185*2c81fb9cSAntonio Huete Jimenez 	ret = fchown(fd, owner, group);
186*2c81fb9cSAntonio Huete Jimenez 	close(fd);
187*2c81fb9cSAntonio Huete Jimenez 	return ret;
188*2c81fb9cSAntonio Huete Jimenez # endif
189*2c81fb9cSAntonio Huete Jimenez }
190*2c81fb9cSAntonio Huete Jimenez #endif
191*2c81fb9cSAntonio Huete Jimenez 
192*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_FCHMODAT
193*2c81fb9cSAntonio Huete Jimenez /*
194*2c81fb9cSAntonio Huete Jimenez  * A limited implementation of fchmodat() that only implements the
195*2c81fb9cSAntonio Huete Jimenez  * functionality used by OpenSSH, currently only AT_FDCWD and
196*2c81fb9cSAntonio Huete Jimenez  * AT_SYMLINK_NOFOLLOW.
197*2c81fb9cSAntonio Huete Jimenez  */
198*2c81fb9cSAntonio Huete Jimenez int
fchmodat(int fd,const char * path,mode_t mode,int flag)199*2c81fb9cSAntonio Huete Jimenez fchmodat(int fd, const char *path, mode_t mode, int flag)
200*2c81fb9cSAntonio Huete Jimenez {
201*2c81fb9cSAntonio Huete Jimenez 	int ret, oflags = O_WRONLY;
202*2c81fb9cSAntonio Huete Jimenez 
203*2c81fb9cSAntonio Huete Jimenez 	if (fd != AT_FDCWD) {
204*2c81fb9cSAntonio Huete Jimenez 		errno = ENOSYS;
205*2c81fb9cSAntonio Huete Jimenez 		return -1;
206*2c81fb9cSAntonio Huete Jimenez 	}
207*2c81fb9cSAntonio Huete Jimenez # ifndef HAVE_FCHMOD
208*2c81fb9cSAntonio Huete Jimenez 	return chmod(path, mode);
209*2c81fb9cSAntonio Huete Jimenez # else
210*2c81fb9cSAntonio Huete Jimenez #  ifdef O_NOFOLLOW
211*2c81fb9cSAntonio Huete Jimenez 	if (flag & AT_SYMLINK_NOFOLLOW)
212*2c81fb9cSAntonio Huete Jimenez 		oflags |= O_NOFOLLOW;
213*2c81fb9cSAntonio Huete Jimenez #  endif /* O_NOFOLLOW */
214*2c81fb9cSAntonio Huete Jimenez 	if ((fd = open(path, oflags)) == -1)
215*2c81fb9cSAntonio Huete Jimenez 		return -1;
216*2c81fb9cSAntonio Huete Jimenez 	ret = fchmod(fd, mode);
217*2c81fb9cSAntonio Huete Jimenez 	close(fd);
218*2c81fb9cSAntonio Huete Jimenez 	return ret;
219*2c81fb9cSAntonio Huete Jimenez # endif
220*2c81fb9cSAntonio Huete Jimenez }
221*2c81fb9cSAntonio Huete Jimenez #endif
222*2c81fb9cSAntonio Huete Jimenez 
223*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_TRUNCATE
truncate(const char * path,off_t length)224*2c81fb9cSAntonio Huete Jimenez int truncate(const char *path, off_t length)
225*2c81fb9cSAntonio Huete Jimenez {
226*2c81fb9cSAntonio Huete Jimenez 	int fd, ret, saverrno;
227*2c81fb9cSAntonio Huete Jimenez 
228*2c81fb9cSAntonio Huete Jimenez 	fd = open(path, O_WRONLY);
229*2c81fb9cSAntonio Huete Jimenez 	if (fd < 0)
230*2c81fb9cSAntonio Huete Jimenez 		return (-1);
231*2c81fb9cSAntonio Huete Jimenez 
232*2c81fb9cSAntonio Huete Jimenez 	ret = ftruncate(fd, length);
233*2c81fb9cSAntonio Huete Jimenez 	saverrno = errno;
234*2c81fb9cSAntonio Huete Jimenez 	close(fd);
235*2c81fb9cSAntonio Huete Jimenez 	if (ret == -1)
236*2c81fb9cSAntonio Huete Jimenez 		errno = saverrno;
237*2c81fb9cSAntonio Huete Jimenez 
238*2c81fb9cSAntonio Huete Jimenez 	return(ret);
239*2c81fb9cSAntonio Huete Jimenez }
240*2c81fb9cSAntonio Huete Jimenez #endif /* HAVE_TRUNCATE */
241*2c81fb9cSAntonio Huete Jimenez 
242*2c81fb9cSAntonio Huete Jimenez #if !defined(HAVE_NANOSLEEP) && !defined(HAVE_NSLEEP)
nanosleep(const struct timespec * req,struct timespec * rem)243*2c81fb9cSAntonio Huete Jimenez int nanosleep(const struct timespec *req, struct timespec *rem)
244*2c81fb9cSAntonio Huete Jimenez {
245*2c81fb9cSAntonio Huete Jimenez 	int rc, saverrno;
246*2c81fb9cSAntonio Huete Jimenez 	extern int errno;
247*2c81fb9cSAntonio Huete Jimenez 	struct timeval tstart, tstop, tremain, time2wait;
248*2c81fb9cSAntonio Huete Jimenez 
249*2c81fb9cSAntonio Huete Jimenez 	TIMESPEC_TO_TIMEVAL(&time2wait, req)
250*2c81fb9cSAntonio Huete Jimenez 	(void) gettimeofday(&tstart, NULL);
251*2c81fb9cSAntonio Huete Jimenez 	rc = select(0, NULL, NULL, NULL, &time2wait);
252*2c81fb9cSAntonio Huete Jimenez 	if (rc == -1) {
253*2c81fb9cSAntonio Huete Jimenez 		saverrno = errno;
254*2c81fb9cSAntonio Huete Jimenez 		(void) gettimeofday (&tstop, NULL);
255*2c81fb9cSAntonio Huete Jimenez 		errno = saverrno;
256*2c81fb9cSAntonio Huete Jimenez 		tremain.tv_sec = time2wait.tv_sec -
257*2c81fb9cSAntonio Huete Jimenez 			(tstop.tv_sec - tstart.tv_sec);
258*2c81fb9cSAntonio Huete Jimenez 		tremain.tv_usec = time2wait.tv_usec -
259*2c81fb9cSAntonio Huete Jimenez 			(tstop.tv_usec - tstart.tv_usec);
260*2c81fb9cSAntonio Huete Jimenez 		tremain.tv_sec += tremain.tv_usec / 1000000L;
261*2c81fb9cSAntonio Huete Jimenez 		tremain.tv_usec %= 1000000L;
262*2c81fb9cSAntonio Huete Jimenez 	} else {
263*2c81fb9cSAntonio Huete Jimenez 		tremain.tv_sec = 0;
264*2c81fb9cSAntonio Huete Jimenez 		tremain.tv_usec = 0;
265*2c81fb9cSAntonio Huete Jimenez 	}
266*2c81fb9cSAntonio Huete Jimenez 	if (rem != NULL)
267*2c81fb9cSAntonio Huete Jimenez 		TIMEVAL_TO_TIMESPEC(&tremain, rem)
268*2c81fb9cSAntonio Huete Jimenez 
269*2c81fb9cSAntonio Huete Jimenez 	return(rc);
270*2c81fb9cSAntonio Huete Jimenez }
271*2c81fb9cSAntonio Huete Jimenez #endif
272*2c81fb9cSAntonio Huete Jimenez 
273*2c81fb9cSAntonio Huete Jimenez #if !defined(HAVE_USLEEP)
usleep(unsigned int useconds)274*2c81fb9cSAntonio Huete Jimenez int usleep(unsigned int useconds)
275*2c81fb9cSAntonio Huete Jimenez {
276*2c81fb9cSAntonio Huete Jimenez 	struct timespec ts;
277*2c81fb9cSAntonio Huete Jimenez 
278*2c81fb9cSAntonio Huete Jimenez 	ts.tv_sec = useconds / 1000000;
279*2c81fb9cSAntonio Huete Jimenez 	ts.tv_nsec = (useconds % 1000000) * 1000;
280*2c81fb9cSAntonio Huete Jimenez 	return nanosleep(&ts, NULL);
281*2c81fb9cSAntonio Huete Jimenez }
282*2c81fb9cSAntonio Huete Jimenez #endif
283*2c81fb9cSAntonio Huete Jimenez 
284*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_TCGETPGRP
285*2c81fb9cSAntonio Huete Jimenez pid_t
tcgetpgrp(int fd)286*2c81fb9cSAntonio Huete Jimenez tcgetpgrp(int fd)
287*2c81fb9cSAntonio Huete Jimenez {
288*2c81fb9cSAntonio Huete Jimenez 	int ctty_pgrp;
289*2c81fb9cSAntonio Huete Jimenez 
290*2c81fb9cSAntonio Huete Jimenez 	if (ioctl(fd, TIOCGPGRP, &ctty_pgrp) == -1)
291*2c81fb9cSAntonio Huete Jimenez 		return(-1);
292*2c81fb9cSAntonio Huete Jimenez 	else
293*2c81fb9cSAntonio Huete Jimenez 		return(ctty_pgrp);
294*2c81fb9cSAntonio Huete Jimenez }
295*2c81fb9cSAntonio Huete Jimenez #endif /* HAVE_TCGETPGRP */
296*2c81fb9cSAntonio Huete Jimenez 
297*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_TCSENDBREAK
298*2c81fb9cSAntonio Huete Jimenez int
tcsendbreak(int fd,int duration)299*2c81fb9cSAntonio Huete Jimenez tcsendbreak(int fd, int duration)
300*2c81fb9cSAntonio Huete Jimenez {
301*2c81fb9cSAntonio Huete Jimenez # if defined(TIOCSBRK) && defined(TIOCCBRK)
302*2c81fb9cSAntonio Huete Jimenez 	struct timeval sleepytime;
303*2c81fb9cSAntonio Huete Jimenez 
304*2c81fb9cSAntonio Huete Jimenez 	sleepytime.tv_sec = 0;
305*2c81fb9cSAntonio Huete Jimenez 	sleepytime.tv_usec = 400000;
306*2c81fb9cSAntonio Huete Jimenez 	if (ioctl(fd, TIOCSBRK, 0) == -1)
307*2c81fb9cSAntonio Huete Jimenez 		return (-1);
308*2c81fb9cSAntonio Huete Jimenez 	(void)select(0, 0, 0, 0, &sleepytime);
309*2c81fb9cSAntonio Huete Jimenez 	if (ioctl(fd, TIOCCBRK, 0) == -1)
310*2c81fb9cSAntonio Huete Jimenez 		return (-1);
311*2c81fb9cSAntonio Huete Jimenez 	return (0);
312*2c81fb9cSAntonio Huete Jimenez # else
313*2c81fb9cSAntonio Huete Jimenez 	return -1;
314*2c81fb9cSAntonio Huete Jimenez # endif
315*2c81fb9cSAntonio Huete Jimenez }
316*2c81fb9cSAntonio Huete Jimenez #endif /* HAVE_TCSENDBREAK */
317*2c81fb9cSAntonio Huete Jimenez 
318*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_STRDUP
319*2c81fb9cSAntonio Huete Jimenez char *
strdup(const char * str)320*2c81fb9cSAntonio Huete Jimenez strdup(const char *str)
321*2c81fb9cSAntonio Huete Jimenez {
322*2c81fb9cSAntonio Huete Jimenez 	size_t len;
323*2c81fb9cSAntonio Huete Jimenez 	char *cp;
324*2c81fb9cSAntonio Huete Jimenez 
325*2c81fb9cSAntonio Huete Jimenez 	len = strlen(str) + 1;
326*2c81fb9cSAntonio Huete Jimenez 	cp = malloc(len);
327*2c81fb9cSAntonio Huete Jimenez 	if (cp != NULL)
328*2c81fb9cSAntonio Huete Jimenez 		return(memcpy(cp, str, len));
329*2c81fb9cSAntonio Huete Jimenez 	return NULL;
330*2c81fb9cSAntonio Huete Jimenez }
331*2c81fb9cSAntonio Huete Jimenez #endif
332*2c81fb9cSAntonio Huete Jimenez 
333*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_ISBLANK
334*2c81fb9cSAntonio Huete Jimenez int
isblank(int c)335*2c81fb9cSAntonio Huete Jimenez isblank(int c)
336*2c81fb9cSAntonio Huete Jimenez {
337*2c81fb9cSAntonio Huete Jimenez 	return (c == ' ' || c == '\t');
338*2c81fb9cSAntonio Huete Jimenez }
339*2c81fb9cSAntonio Huete Jimenez #endif
340*2c81fb9cSAntonio Huete Jimenez 
341*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_GETPGID
342*2c81fb9cSAntonio Huete Jimenez pid_t
getpgid(pid_t pid)343*2c81fb9cSAntonio Huete Jimenez getpgid(pid_t pid)
344*2c81fb9cSAntonio Huete Jimenez {
345*2c81fb9cSAntonio Huete Jimenez #if defined(HAVE_GETPGRP) && !defined(GETPGRP_VOID) && GETPGRP_VOID == 0
346*2c81fb9cSAntonio Huete Jimenez 	return getpgrp(pid);
347*2c81fb9cSAntonio Huete Jimenez #elif defined(HAVE_GETPGRP)
348*2c81fb9cSAntonio Huete Jimenez 	if (pid == 0)
349*2c81fb9cSAntonio Huete Jimenez 		return getpgrp();
350*2c81fb9cSAntonio Huete Jimenez #endif
351*2c81fb9cSAntonio Huete Jimenez 
352*2c81fb9cSAntonio Huete Jimenez 	errno = ESRCH;
353*2c81fb9cSAntonio Huete Jimenez 	return -1;
354*2c81fb9cSAntonio Huete Jimenez }
355*2c81fb9cSAntonio Huete Jimenez #endif
356*2c81fb9cSAntonio Huete Jimenez 
3572c0338ffSzrj #ifndef HAVE_PLEDGE
3582c0338ffSzrj int
pledge(const char * promises,const char * paths[])3592c0338ffSzrj pledge(const char *promises, const char *paths[])
3602c0338ffSzrj {
3612c0338ffSzrj 	return 0;
3622c0338ffSzrj }
3632c0338ffSzrj #endif
364*2c81fb9cSAntonio Huete Jimenez 
365*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_MBTOWC
366*2c81fb9cSAntonio Huete Jimenez /* a mbtowc that only supports ASCII */
367*2c81fb9cSAntonio Huete Jimenez int
mbtowc(wchar_t * pwc,const char * s,size_t n)368*2c81fb9cSAntonio Huete Jimenez mbtowc(wchar_t *pwc, const char *s, size_t n)
369*2c81fb9cSAntonio Huete Jimenez {
370*2c81fb9cSAntonio Huete Jimenez 	if (s == NULL || *s == '\0')
371*2c81fb9cSAntonio Huete Jimenez 		return 0;	/* ASCII is not state-dependent */
372*2c81fb9cSAntonio Huete Jimenez 	if (*s < 0 || *s > 0x7f || n < 1) {
373*2c81fb9cSAntonio Huete Jimenez 		errno = EOPNOTSUPP;
374*2c81fb9cSAntonio Huete Jimenez 		return -1;
375*2c81fb9cSAntonio Huete Jimenez 	}
376*2c81fb9cSAntonio Huete Jimenez 	if (pwc != NULL)
377*2c81fb9cSAntonio Huete Jimenez 		*pwc = *s;
378*2c81fb9cSAntonio Huete Jimenez 	return 1;
379*2c81fb9cSAntonio Huete Jimenez }
380*2c81fb9cSAntonio Huete Jimenez #endif
381*2c81fb9cSAntonio Huete Jimenez 
382*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_LLABS
383*2c81fb9cSAntonio Huete Jimenez long long
llabs(long long j)384*2c81fb9cSAntonio Huete Jimenez llabs(long long j)
385*2c81fb9cSAntonio Huete Jimenez {
386*2c81fb9cSAntonio Huete Jimenez 	return (j < 0 ? -j : j);
387*2c81fb9cSAntonio Huete Jimenez }
388*2c81fb9cSAntonio Huete Jimenez #endif
389*2c81fb9cSAntonio Huete Jimenez 
390*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_BZERO
391*2c81fb9cSAntonio Huete Jimenez void
bzero(void * b,size_t n)392*2c81fb9cSAntonio Huete Jimenez bzero(void *b, size_t n)
393*2c81fb9cSAntonio Huete Jimenez {
394*2c81fb9cSAntonio Huete Jimenez 	(void)memset(b, 0, n);
395*2c81fb9cSAntonio Huete Jimenez }
396*2c81fb9cSAntonio Huete Jimenez #endif
397*2c81fb9cSAntonio Huete Jimenez 
398*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_RAISE
399*2c81fb9cSAntonio Huete Jimenez int
raise(int sig)400*2c81fb9cSAntonio Huete Jimenez raise(int sig)
401*2c81fb9cSAntonio Huete Jimenez {
402*2c81fb9cSAntonio Huete Jimenez 	kill(getpid(), sig);
403*2c81fb9cSAntonio Huete Jimenez }
404*2c81fb9cSAntonio Huete Jimenez #endif
405*2c81fb9cSAntonio Huete Jimenez 
406*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_GETSID
407*2c81fb9cSAntonio Huete Jimenez pid_t
getsid(pid_t pid)408*2c81fb9cSAntonio Huete Jimenez getsid(pid_t pid)
409*2c81fb9cSAntonio Huete Jimenez {
410*2c81fb9cSAntonio Huete Jimenez 	errno = ENOSYS;
411*2c81fb9cSAntonio Huete Jimenez 	return -1;
412*2c81fb9cSAntonio Huete Jimenez }
413*2c81fb9cSAntonio Huete Jimenez #endif
414*2c81fb9cSAntonio Huete Jimenez 
415*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_KILLPG
416*2c81fb9cSAntonio Huete Jimenez int
killpg(pid_t pgrp,int sig)417*2c81fb9cSAntonio Huete Jimenez killpg(pid_t pgrp, int sig)
418*2c81fb9cSAntonio Huete Jimenez {
419*2c81fb9cSAntonio Huete Jimenez 	return kill(pgrp, sig);
420*2c81fb9cSAntonio Huete Jimenez }
421*2c81fb9cSAntonio Huete Jimenez #endif
422*2c81fb9cSAntonio Huete Jimenez 
423*2c81fb9cSAntonio Huete Jimenez #ifdef FFLUSH_NULL_BUG
424*2c81fb9cSAntonio Huete Jimenez #undef fflush
_ssh_compat_fflush(FILE * f)425*2c81fb9cSAntonio Huete Jimenez int _ssh_compat_fflush(FILE *f)
426*2c81fb9cSAntonio Huete Jimenez {
427*2c81fb9cSAntonio Huete Jimenez 	int r1, r2;
428*2c81fb9cSAntonio Huete Jimenez 
429*2c81fb9cSAntonio Huete Jimenez 	if (f == NULL) {
430*2c81fb9cSAntonio Huete Jimenez 		r1 = fflush(stdout);
431*2c81fb9cSAntonio Huete Jimenez 		r2 = fflush(stderr);
432*2c81fb9cSAntonio Huete Jimenez 		if (r1 == -1 || r2 == -1)
433*2c81fb9cSAntonio Huete Jimenez 			return -1;
434*2c81fb9cSAntonio Huete Jimenez 		return 0;
435*2c81fb9cSAntonio Huete Jimenez 	}
436*2c81fb9cSAntonio Huete Jimenez 	return fflush(f);
437*2c81fb9cSAntonio Huete Jimenez }
438*2c81fb9cSAntonio Huete Jimenez #endif
439*2c81fb9cSAntonio Huete Jimenez 
440*2c81fb9cSAntonio Huete Jimenez #ifndef HAVE_LOCALTIME_R
441*2c81fb9cSAntonio Huete Jimenez struct tm *
localtime_r(const time_t * timep,struct tm * result)442*2c81fb9cSAntonio Huete Jimenez localtime_r(const time_t *timep, struct tm *result)
443*2c81fb9cSAntonio Huete Jimenez {
444*2c81fb9cSAntonio Huete Jimenez 	struct tm *tm = localtime(timep);
445*2c81fb9cSAntonio Huete Jimenez 	*result = *tm;
446*2c81fb9cSAntonio Huete Jimenez 	return result;
447*2c81fb9cSAntonio Huete Jimenez }
448*2c81fb9cSAntonio Huete Jimenez #endif
449*2c81fb9cSAntonio Huete Jimenez 
450*2c81fb9cSAntonio Huete Jimenez #ifdef ASAN_OPTIONS
__asan_default_options(void)451*2c81fb9cSAntonio Huete Jimenez const char *__asan_default_options(void) {
452*2c81fb9cSAntonio Huete Jimenez 	return ASAN_OPTIONS;
453*2c81fb9cSAntonio Huete Jimenez }
454*2c81fb9cSAntonio Huete Jimenez #endif
455*2c81fb9cSAntonio Huete Jimenez 
456*2c81fb9cSAntonio Huete Jimenez #ifdef MSAN_OPTIONS
__msan_default_options(void)457*2c81fb9cSAntonio Huete Jimenez const char *__msan_default_options(void) {
458*2c81fb9cSAntonio Huete Jimenez 	return MSAN_OPTIONS;
459*2c81fb9cSAntonio Huete Jimenez }
460*2c81fb9cSAntonio Huete Jimenez #endif
461