1 /* Copyright 1988,1990,1993,1994 by Paul Vixie
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
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
18 #if !defined(lint) && !defined(LINT)
19 static char rcsid[] = "$FreeBSD$";
22 /* vix 30dec93 [broke this out of misc.c - see RCS log for history]
23 * vix 15jan87 [added TIOCNOTTY, thanks csg@pyramid]
28 #ifdef NEED_GETDTABLESIZE
31 #if defined(NEED_SETSID) && defined(BSD)
32 # include <sys/ioctl.h>
45 if ((temp = malloc(strlen(str) + 1)) == NULL) {
49 (void) strcpy(temp, str);
60 extern char *sys_errlist[];
64 if ((error <= sys_nerr) && (error > 0)) {
65 return sys_errlist[error];
68 sprintf(buf, "Unknown error: %d", error);
74 #ifdef NEED_STRCASECMP
76 strcasecmp(left, right)
80 while (*left && (MkLower(*left) == MkLower(*right))) {
84 return MkLower(*left) - MkLower(*right);
97 newpgrp = setpgid((pid_t)0, getpid());
99 newpgrp = setpgrp(0, getpid());
101 if ((fd = open(_PATH_TTY, 2)) >= 0)
103 (void) ioctl(fd, TIOCNOTTY, (char*)0);
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);
115 #endif /*NEED_SETSID*/
118 #ifdef NEED_GETDTABLESIZE
122 return sysconf(_SC_OPEN_MAX);
124 return _POSIX_OPEN_MAX;
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 */
140 * flock (fd, operation)
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.
146 * The operations that are available are:
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.
153 * Return value: 0 if lock successful, -1 if failed.
155 * Note that whether the locks are enforced or advisory is
156 * controlled by the presence or absence of the SETGID bit on
159 * Note that there is no difference between shared and exclusive
160 * locks, since the 'lockf' system call in SYSV doesn't make any
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
168 /* this code has been reformatted by vixie */
178 case LOCK_SH: /* get a shared lock */
179 case LOCK_EX: /* get an exclusive lock */
180 i = lockf (fd, F_LOCK, 0);
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);
187 if ((errno == EAGAIN) || (errno == EACCES))
191 case LOCK_UN: /* unlock */
192 i = lockf (fd, F_ULOCK, 0);
195 default: /* can't decipher operation */
203 #endif /*NEED_FLOCK*/
208 setenv(name, value, overwrite)
214 if (overwrite && getenv(name))
217 if (!(tmp = malloc(strlen(name) + strlen(value) + 2))) {
222 sprintf(tmp, "%s=%s", name, value);
223 return putenv(tmp); /* intentionally orphan 'tmp' storage */