1/* Copyright 1988,1990,1993,1994 by Paul Vixie
2 * All rights reserved
3 *
4 * Distribute freely, except: don't remove my name from the source or
5 * documentation (don't take credit for my work), mark your changes (don't
6 * get me blamed for your possible bugs), don't alter or remove this
7 * notice.  May be sold if buildable source is provided to buyer.  No
8 * warrantee of any kind, express or implied, is included with this
9 * software; use at your own risk, responsibility for damages (if any) to
10 * anyone resulting from the use of this software rests entirely with the
11 * user.
12 *
13 * Send bug reports, bug fixes, enhancements, requests, flames, etc., and
14 * I'll try to keep a version up to date.  I can be reached as follows:
15 * Paul Vixie          <paul@vix.com>          uunet!decwrl!vixie!paul
16 */
17
18#if !defined(lint) && !defined(LINT)
19static char rcsid[] = "$FreeBSD: stable/11/usr.sbin/cron/lib/compat.c 358255 2020-02-23 03:13:38Z kevans $";
20#endif
21
22/* vix 30dec93 [broke this out of misc.c - see RCS log for history]
23 * vix 15jan87 [added TIOCNOTTY, thanks csg@pyramid]
24 */
25
26
27#include "cron.h"
28#ifdef NEED_GETDTABLESIZE
29# include <limits.h>
30#endif
31#if defined(NEED_SETSID) && defined(BSD)
32# include <sys/ioctl.h>
33#endif
34#include <errno.h>
35#include <paths.h>
36
37
38#ifdef NEED_STRDUP
39char *
40strdup(str)
41	char	*str;
42{
43	char	*temp;
44
45	if ((temp = malloc(strlen(str) + 1)) == NULL) {
46		errno = ENOMEM;
47		return NULL;
48	}
49	(void) strcpy(temp, str);
50	return temp;
51}
52#endif
53
54
55#ifdef NEED_STRERROR
56char *
57strerror(error)
58	int error;
59{
60	extern char *sys_errlist[];
61	extern int sys_nerr;
62	static char buf[32];
63
64	if ((error <= sys_nerr) && (error > 0)) {
65		return sys_errlist[error];
66	}
67
68	sprintf(buf, "Unknown error: %d", error);
69	return buf;
70}
71#endif
72
73
74#ifdef NEED_STRCASECMP
75int
76strcasecmp(left, right)
77	char	*left;
78	char	*right;
79{
80	while (*left && (MkLower(*left) == MkLower(*right))) {
81		left++;
82		right++;
83	}
84	return MkLower(*left) - MkLower(*right);
85}
86#endif
87
88
89#ifdef NEED_SETSID
90int
91setsid()
92{
93	int	newpgrp;
94# if defined(BSD)
95	int	fd;
96#  if defined(POSIX)
97	newpgrp = setpgid((pid_t)0, getpid());
98#  else
99	newpgrp = setpgrp(0, getpid());
100#  endif
101	if ((fd = open(_PATH_TTY, 2)) >= 0)
102	{
103		(void) ioctl(fd, TIOCNOTTY, (char*)0);
104		(void) close(fd);
105	}
106# else /*BSD*/
107	newpgrp = setpgrp();
108
109	(void) close(STDIN);	(void) open(_PATH_DEVNULL, 0);
110	(void) close(STDOUT);	(void) open(_PATH_DEVNULL, 1);
111	(void) close(STDERR);	(void) open(_PATH_DEVNULL, 2);
112# endif /*BSD*/
113	return newpgrp;
114}
115#endif /*NEED_SETSID*/
116
117
118#ifdef NEED_GETDTABLESIZE
119int
120getdtablesize() {
121#ifdef _SC_OPEN_MAX
122	return sysconf(_SC_OPEN_MAX);
123#else
124	return _POSIX_OPEN_MAX;
125#endif
126}
127#endif
128
129
130#ifdef NEED_FLOCK
131/* The following flock() emulation snarfed intact *) from the HP-UX
132 * "BSD to HP-UX porting tricks" maintained by
133 * system@alchemy.chem.utoronto.ca (System Admin (Mike Peterson))
134 * from the version "last updated: 11-Jan-1993"
135 * Snarfage done by Jarkko Hietaniemi <Jarkko.Hietaniemi@hut.fi>
136 * *) well, almost, had to K&R the function entry, HPUX "cc"
137 * does not grok ANSI function prototypes */
138
139/*
140 * flock (fd, operation)
141 *
142 * This routine performs some file locking like the BSD 'flock'
143 * on the object described by the int file descriptor 'fd',
144 * which must already be open.
145 *
146 * The operations that are available are:
147 *
148 * LOCK_SH  -  get a shared lock.
149 * LOCK_EX  -  get an exclusive lock.
150 * LOCK_NB  -  don't block (must be ORed with LOCK_SH or LOCK_EX).
151 * LOCK_UN  -  release a lock.
152 *
153 * Return value: 0 if lock successful, -1 if failed.
154 *
155 * Note that whether the locks are enforced or advisory is
156 * controlled by the presence or absence of the SETGID bit on
157 * the executable.
158 *
159 * Note that there is no difference between shared and exclusive
160 * locks, since the 'lockf' system call in SYSV doesn't make any
161 * distinction.
162 *
163 * The file "<sys/file.h>" should be modified to contain the definitions
164 * of the available operations, which must be added manually (see below
165 * for the values).
166 */
167
168/* this code has been reformatted by vixie */
169
170int
171flock(fd, operation)
172	int fd;
173	int operation;
174{
175	int i;
176
177	switch (operation) {
178	case LOCK_SH:		/* get a shared lock */
179	case LOCK_EX:		/* get an exclusive lock */
180		i = lockf (fd, F_LOCK, 0);
181		break;
182
183	case LOCK_SH|LOCK_NB:	/* get a non-blocking shared lock */
184	case LOCK_EX|LOCK_NB:	/* get a non-blocking exclusive lock */
185		i = lockf (fd, F_TLOCK, 0);
186		if (i == -1)
187			if ((errno == EAGAIN) || (errno == EACCES))
188				errno = EWOULDBLOCK;
189		break;
190
191	case LOCK_UN:		/* unlock */
192		i = lockf (fd, F_ULOCK, 0);
193		break;
194
195	default:		/* can't decipher operation */
196		i = -1;
197		errno = EINVAL;
198		break;
199	}
200
201	return (i);
202}
203#endif /*NEED_FLOCK*/
204
205
206#ifdef NEED_SETENV
207int
208setenv(name, value, overwrite)
209	char *name, *value;
210	int overwrite;
211{
212	char *tmp;
213
214	if (overwrite && getenv(name))
215		return -1;
216
217	if (!(tmp = malloc(strlen(name) + strlen(value) + 2))) {
218		errno = ENOMEM;
219		return -1;
220	}
221
222	sprintf(tmp, "%s=%s", name, value);
223	return putenv(tmp);	/* intentionally orphan 'tmp' storage */
224}
225#endif
226