Branch data Line data Source code
1 : :
2 : : /*
3 : : * Copyright (c) 1999-2004 Damien Miller <djm@mindrot.org>
4 : : *
5 : : * Permission to use, copy, modify, and distribute this software for any
6 : : * purpose with or without fee is hereby granted, provided that the above
7 : : * copyright notice and this permission notice appear in all copies.
8 : : *
9 : : * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 : : * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 : : * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 : : * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 : : * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 : : * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 : : * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 : : */
17 : :
18 : : #include "includes.h"
19 : :
20 : : #include <sys/types.h>
21 : : #ifdef HAVE_SYS_SELECT_H
22 : : # include <sys/select.h>
23 : : #endif
24 : : #ifdef HAVE_SYS_TIME_H
25 : : # include <sys/time.h>
26 : : #endif
27 : :
28 : : #include <string.h>
29 : : #include <signal.h>
30 : : #include <stdlib.h>
31 : : #include <time.h>
32 : : #include <unistd.h>
33 : :
34 : : #include "xmalloc.h"
35 : :
36 : : #ifndef HAVE___PROGNAME
37 : : char *__progname;
38 : : #endif
39 : :
40 : : /*
41 : : * NB. duplicate __progname in case it is an alias for argv[0]
42 : : * Otherwise it may get clobbered by setproctitle()
43 : : */
44 : 3991 : char *ssh_get_progname(char *argv0)
45 : : {
46 : : #ifdef HAVE___PROGNAME
47 : : extern char *__progname;
48 : :
49 : 3991 : return xstrdup(__progname);
50 : : #else
51 : : char *p;
52 : :
53 : : if (argv0 == NULL)
54 : : return ("unknown"); /* XXX */
55 : : p = strrchr(argv0, '/');
56 : : if (p == NULL)
57 : : p = argv0;
58 : : else
59 : : p++;
60 : :
61 : : return (xstrdup(p));
62 : : #endif
63 : : }
64 : :
65 : : #ifndef HAVE_SETLOGIN
66 : : int setlogin(const char *name)
67 : : {
68 : 0 : return (0);
69 : : }
70 : : #endif /* !HAVE_SETLOGIN */
71 : :
72 : : #ifndef HAVE_INNETGR
73 : : int innetgr(const char *netgroup, const char *host,
74 : : const char *user, const char *domain)
75 : : {
76 : : return (0);
77 : : }
78 : : #endif /* HAVE_INNETGR */
79 : :
80 : : #if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID)
81 : : int seteuid(uid_t euid)
82 : : {
83 : : return (setreuid(-1, euid));
84 : : }
85 : : #endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */
86 : :
87 : : #if !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID)
88 : : int setegid(uid_t egid)
89 : : {
90 : : return(setresgid(-1, egid, -1));
91 : : }
92 : : #endif /* !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) */
93 : :
94 : : #if !defined(HAVE_STRERROR) && defined(HAVE_SYS_ERRLIST) && defined(HAVE_SYS_NERR)
95 : : const char *strerror(int e)
96 : : {
97 : : extern int sys_nerr;
98 : : extern char *sys_errlist[];
99 : :
100 : : if ((e >= 0) && (e < sys_nerr))
101 : : return (sys_errlist[e]);
102 : :
103 : : return ("unlisted error");
104 : : }
105 : : #endif
106 : :
107 : : #ifndef HAVE_UTIMES
108 : : int utimes(char *filename, struct timeval *tvp)
109 : : {
110 : : struct utimbuf ub;
111 : :
112 : : ub.actime = tvp[0].tv_sec;
113 : : ub.modtime = tvp[1].tv_sec;
114 : :
115 : : return (utime(filename, &ub));
116 : : }
117 : : #endif
118 : :
119 : : #ifndef HAVE_TRUNCATE
120 : : int truncate(const char *path, off_t length)
121 : : {
122 : : int fd, ret, saverrno;
123 : :
124 : : fd = open(path, O_WRONLY);
125 : : if (fd < 0)
126 : : return (-1);
127 : :
128 : : ret = ftruncate(fd, length);
129 : : saverrno = errno;
130 : : close(fd);
131 : : if (ret == -1)
132 : : errno = saverrno;
133 : :
134 : : return(ret);
135 : : }
136 : : #endif /* HAVE_TRUNCATE */
137 : :
138 : : #if !defined(HAVE_NANOSLEEP) && !defined(HAVE_NSLEEP)
139 : : int nanosleep(const struct timespec *req, struct timespec *rem)
140 : : {
141 : : int rc, saverrno;
142 : : extern int errno;
143 : : struct timeval tstart, tstop, tremain, time2wait;
144 : :
145 : : TIMESPEC_TO_TIMEVAL(&time2wait, req)
146 : : (void) gettimeofday(&tstart, NULL);
147 : : rc = select(0, NULL, NULL, NULL, &time2wait);
148 : : if (rc == -1) {
149 : : saverrno = errno;
150 : : (void) gettimeofday (&tstop, NULL);
151 : : errno = saverrno;
152 : : tremain.tv_sec = time2wait.tv_sec -
153 : : (tstop.tv_sec - tstart.tv_sec);
154 : : tremain.tv_usec = time2wait.tv_usec -
155 : : (tstop.tv_usec - tstart.tv_usec);
156 : : tremain.tv_sec += tremain.tv_usec / 1000000L;
157 : : tremain.tv_usec %= 1000000L;
158 : : } else {
159 : : tremain.tv_sec = 0;
160 : : tremain.tv_usec = 0;
161 : : }
162 : : if (rem != NULL)
163 : : TIMEVAL_TO_TIMESPEC(&tremain, rem)
164 : :
165 : : return(rc);
166 : : }
167 : : #endif
168 : :
169 : : #if !defined(HAVE_USLEEP)
170 : : int usleep(unsigned int useconds)
171 : : {
172 : : struct timespec ts;
173 : :
174 : : ts.tv_sec = useconds / 1000000;
175 : : ts.tv_nsec = (useconds % 1000000) * 1000;
176 : : return nanosleep(&ts, NULL);
177 : : }
178 : : #endif
179 : :
180 : : #ifndef HAVE_TCGETPGRP
181 : : pid_t
182 : : tcgetpgrp(int fd)
183 : : {
184 : : int ctty_pgrp;
185 : :
186 : : if (ioctl(fd, TIOCGPGRP, &ctty_pgrp) == -1)
187 : : return(-1);
188 : : else
189 : : return(ctty_pgrp);
190 : : }
191 : : #endif /* HAVE_TCGETPGRP */
192 : :
193 : : #ifndef HAVE_TCSENDBREAK
194 : : int
195 : : tcsendbreak(int fd, int duration)
196 : : {
197 : : # if defined(TIOCSBRK) && defined(TIOCCBRK)
198 : : struct timeval sleepytime;
199 : :
200 : : sleepytime.tv_sec = 0;
201 : : sleepytime.tv_usec = 400000;
202 : : if (ioctl(fd, TIOCSBRK, 0) == -1)
203 : : return (-1);
204 : : (void)select(0, 0, 0, 0, &sleepytime);
205 : : if (ioctl(fd, TIOCCBRK, 0) == -1)
206 : : return (-1);
207 : : return (0);
208 : : # else
209 : : return -1;
210 : : # endif
211 : : }
212 : : #endif /* HAVE_TCSENDBREAK */
213 : :
214 : : mysig_t
215 : 24479 : mysignal(int sig, mysig_t act)
216 : : {
217 : : #ifdef HAVE_SIGACTION
218 : : struct sigaction sa, osa;
219 : :
220 [ + - ]: 24479 : if (sigaction(sig, NULL, &osa) == -1)
221 : : return (mysig_t) -1;
222 [ + + ]: 24479 : if (osa.sa_handler != act) {
223 : : memset(&sa, 0, sizeof(sa));
224 : 15572 : sigemptyset(&sa.sa_mask);
225 : 15572 : sa.sa_flags = 0;
226 : : #ifdef SA_INTERRUPT
227 [ + + ]: 15572 : if (sig == SIGALRM)
228 : 2068 : sa.sa_flags |= SA_INTERRUPT;
229 : : #endif
230 : 15572 : sa.sa_handler = act;
231 [ + - ]: 15572 : if (sigaction(sig, &sa, NULL) == -1)
232 : : return (mysig_t) -1;
233 : : }
234 : 24479 : return (osa.sa_handler);
235 : : #else
236 : : #undef signal
237 : : return (signal(sig, act));
238 : : #endif
239 : : }
240 : :
241 : : #ifndef HAVE_STRDUP
242 : : char *
243 : : strdup(const char *str)
244 : : {
245 : : size_t len;
246 : : char *cp;
247 : :
248 : : len = strlen(str) + 1;
249 : : cp = malloc(len);
250 : : if (cp != NULL)
251 : : return(memcpy(cp, str, len));
252 : : return NULL;
253 : : }
254 : : #endif
255 : :
256 : : #ifndef HAVE_ISBLANK
257 : : int
258 : : isblank(int c)
259 : : {
260 : : return (c == ' ' || c == '\t');
261 : : }
262 : : #endif
263 : :
264 : : #ifndef HAVE_GETPGID
265 : : pid_t
266 : : getpgid(pid_t pid)
267 : : {
268 : : #if defined(HAVE_GETPGRP) && !defined(GETPGRP_VOID)
269 : : return getpgrp(pid);
270 : : #elif defined(HAVE_GETPGRP)
271 : : if (pid == 0)
272 : : return getpgrp();
273 : : #endif
274 : :
275 : : errno = ESRCH;
276 : : return -1;
277 : : }
278 : : #endif
|