| Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/bash/src/lib/sh/oslib.c |
| Source code | Switch to Preprocessed file |
| Line | Source | Count | ||||||
|---|---|---|---|---|---|---|---|---|
| 1 | /* oslib.c - functions present only in some unix versions. */ | - | ||||||
| 2 | - | |||||||
| 3 | /* Copyright (C) 1995,2010 Free Software Foundation, Inc. | - | ||||||
| 4 | - | |||||||
| 5 | This file is part of GNU Bash, the Bourne Again SHell. | - | ||||||
| 6 | - | |||||||
| 7 | Bash is free software: you can redistribute it and/or modify | - | ||||||
| 8 | it under the terms of the GNU General Public License as published by | - | ||||||
| 9 | the Free Software Foundation, either version 3 of the License, or | - | ||||||
| 10 | (at your option) any later version. | - | ||||||
| 11 | - | |||||||
| 12 | Bash is distributed in the hope that it will be useful, | - | ||||||
| 13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | - | ||||||
| 14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | - | ||||||
| 15 | GNU General Public License for more details. | - | ||||||
| 16 | - | |||||||
| 17 | You should have received a copy of the GNU General Public License | - | ||||||
| 18 | along with Bash. If not, see <http://www.gnu.org/licenses/>. | - | ||||||
| 19 | */ | - | ||||||
| 20 | - | |||||||
| 21 | #include <config.h> | - | ||||||
| 22 | - | |||||||
| 23 | #include <bashtypes.h> | - | ||||||
| 24 | #if defined (HAVE_SYS_PARAM_H) | - | ||||||
| 25 | # include <sys/param.h> | - | ||||||
| 26 | #endif | - | ||||||
| 27 | - | |||||||
| 28 | #if defined (HAVE_UNISTD_H) | - | ||||||
| 29 | # include <unistd.h> | - | ||||||
| 30 | #endif | - | ||||||
| 31 | - | |||||||
| 32 | #if defined (HAVE_LIMITS_H) | - | ||||||
| 33 | # include <limits.h> | - | ||||||
| 34 | #endif | - | ||||||
| 35 | - | |||||||
| 36 | #include <posixstat.h> | - | ||||||
| 37 | #include <filecntl.h> | - | ||||||
| 38 | #include <bashansi.h> | - | ||||||
| 39 | - | |||||||
| 40 | #if !defined (HAVE_KILLPG) | - | ||||||
| 41 | # include <signal.h> | - | ||||||
| 42 | #endif | - | ||||||
| 43 | - | |||||||
| 44 | #include <stdio.h> | - | ||||||
| 45 | #include <errno.h> | - | ||||||
| 46 | #include <chartypes.h> | - | ||||||
| 47 | - | |||||||
| 48 | #include <shell.h> | - | ||||||
| 49 | - | |||||||
| 50 | #if !defined (errno) | - | ||||||
| 51 | extern int errno; | - | ||||||
| 52 | #endif /* !errno */ | - | ||||||
| 53 | - | |||||||
| 54 | /* Make the functions strchr and strrchr if they do not exist. */ | - | ||||||
| 55 | #if !defined (HAVE_STRCHR) | - | ||||||
| 56 | char * | - | ||||||
| 57 | strchr (string, c) | - | ||||||
| 58 | char *string; | - | ||||||
| 59 | int c; | - | ||||||
| 60 | { | - | ||||||
| 61 | register char *s; | - | ||||||
| 62 | - | |||||||
| 63 | for (s = string; s && *s; s++) | - | ||||||
| 64 | if (*s == c) | - | ||||||
| 65 | return (s); | - | ||||||
| 66 | - | |||||||
| 67 | return ((char *) NULL); | - | ||||||
| 68 | } | - | ||||||
| 69 | - | |||||||
| 70 | char * | - | ||||||
| 71 | strrchr (string, c) | - | ||||||
| 72 | char *string; | - | ||||||
| 73 | int c; | - | ||||||
| 74 | { | - | ||||||
| 75 | register char *s, *t; | - | ||||||
| 76 | - | |||||||
| 77 | for (s = string, t = (char *)NULL; s && *s; s++) | - | ||||||
| 78 | if (*s == c) | - | ||||||
| 79 | t = s; | - | ||||||
| 80 | return (t); | - | ||||||
| 81 | } | - | ||||||
| 82 | #endif /* !HAVE_STRCHR */ | - | ||||||
| 83 | - | |||||||
| 84 | #if !defined (HAVE_DUP2) || defined (DUP2_BROKEN) | - | ||||||
| 85 | /* Replacement for dup2 (), for those systems which either don't have it, | - | ||||||
| 86 | or supply one with broken behaviour. */ | - | ||||||
| 87 | int | - | ||||||
| 88 | dup2 (fd1, fd2) | - | ||||||
| 89 | int fd1, fd2; | - | ||||||
| 90 | { | - | ||||||
| 91 | int saved_errno, r; | - | ||||||
| 92 | - | |||||||
| 93 | /* If FD1 is not a valid file descriptor, then return immediately with | - | ||||||
| 94 | an error. */ | - | ||||||
| 95 | if (fcntl (fd1, F_GETFL, 0) == -1) | - | ||||||
| 96 | return (-1); | - | ||||||
| 97 | - | |||||||
| 98 | if (fd2 < 0 || fd2 >= getdtablesize ()) | - | ||||||
| 99 | { | - | ||||||
| 100 | errno = EBADF; | - | ||||||
| 101 | return (-1); | - | ||||||
| 102 | } | - | ||||||
| 103 | - | |||||||
| 104 | if (fd1 == fd2) | - | ||||||
| 105 | return (0); | - | ||||||
| 106 | - | |||||||
| 107 | saved_errno = errno; | - | ||||||
| 108 | - | |||||||
| 109 | (void) close (fd2); | - | ||||||
| 110 | r = fcntl (fd1, F_DUPFD, fd2); | - | ||||||
| 111 | - | |||||||
| 112 | if (r >= 0) | - | ||||||
| 113 | errno = saved_errno; | - | ||||||
| 114 | else | - | ||||||
| 115 | if (errno == EINVAL) | - | ||||||
| 116 | errno = EBADF; | - | ||||||
| 117 | - | |||||||
| 118 | /* Force the new file descriptor to remain open across exec () calls. */ | - | ||||||
| 119 | SET_OPEN_ON_EXEC (fd2); | - | ||||||
| 120 | return (r); | - | ||||||
| 121 | } | - | ||||||
| 122 | #endif /* !HAVE_DUP2 */ | - | ||||||
| 123 | - | |||||||
| 124 | /* | - | ||||||
| 125 | * Return the total number of available file descriptors. | - | ||||||
| 126 | * | - | ||||||
| 127 | * On some systems, like 4.2BSD and its descendants, there is a system call | - | ||||||
| 128 | * that returns the size of the descriptor table: getdtablesize(). There are | - | ||||||
| 129 | * lots of ways to emulate this on non-BSD systems. | - | ||||||
| 130 | * | - | ||||||
| 131 | * On System V.3, this can be obtained via a call to ulimit: | - | ||||||
| 132 | * return (ulimit(4, 0L)); | - | ||||||
| 133 | * | - | ||||||
| 134 | * On other System V systems, NOFILE is defined in /usr/include/sys/param.h | - | ||||||
| 135 | * (this is what we assume below), so we can simply use it: | - | ||||||
| 136 | * return (NOFILE); | - | ||||||
| 137 | * | - | ||||||
| 138 | * On POSIX systems, there are specific functions for retrieving various | - | ||||||
| 139 | * configuration parameters: | - | ||||||
| 140 | * return (sysconf(_SC_OPEN_MAX)); | - | ||||||
| 141 | * | - | ||||||
| 142 | */ | - | ||||||
| 143 | - | |||||||
| 144 | #if !defined (HAVE_GETDTABLESIZE) | - | ||||||
| 145 | int | - | ||||||
| 146 | getdtablesize () | - | ||||||
| 147 | { | - | ||||||
| 148 | # if defined (_POSIX_VERSION) && defined (HAVE_SYSCONF) && defined (_SC_OPEN_MAX) | - | ||||||
| 149 | return (sysconf(_SC_OPEN_MAX)); /* Posix systems use sysconf */ | - | ||||||
| 150 | # else /* ! (_POSIX_VERSION && HAVE_SYSCONF && _SC_OPEN_MAX) */ | - | ||||||
| 151 | # if defined (ULIMIT_MAXFDS) | - | ||||||
| 152 | return (ulimit (4, 0L)); /* System V.3 systems use ulimit(4, 0L) */ | - | ||||||
| 153 | # else /* !ULIMIT_MAXFDS */ | - | ||||||
| 154 | # if defined (NOFILE) /* Other systems use NOFILE */ | - | ||||||
| 155 | return (NOFILE); | - | ||||||
| 156 | # else /* !NOFILE */ | - | ||||||
| 157 | return (20); /* XXX - traditional value is 20 */ | - | ||||||
| 158 | # endif /* !NOFILE */ | - | ||||||
| 159 | # endif /* !ULIMIT_MAXFDS */ | - | ||||||
| 160 | # endif /* ! (_POSIX_VERSION && _SC_OPEN_MAX) */ | - | ||||||
| 161 | } | - | ||||||
| 162 | #endif /* !HAVE_GETDTABLESIZE */ | - | ||||||
| 163 | - | |||||||
| 164 | #if !defined (HAVE_BCOPY) | - | ||||||
| 165 | # if defined (bcopy) | - | ||||||
| 166 | # undef bcopy | - | ||||||
| 167 | # endif | - | ||||||
| 168 | void | - | ||||||
| 169 | bcopy (s,d,n) | - | ||||||
| 170 | char *d, *s; | - | ||||||
| 171 | int n; | - | ||||||
| 172 | { | - | ||||||
| 173 | FASTCOPY (s, d, n); | - | ||||||
| 174 | } | - | ||||||
| 175 | #endif /* !HAVE_BCOPY */ | - | ||||||
| 176 | - | |||||||
| 177 | #if !defined (HAVE_BZERO) | - | ||||||
| 178 | # if defined (bzero) | - | ||||||
| 179 | # undef bzero | - | ||||||
| 180 | # endif | - | ||||||
| 181 | void | - | ||||||
| 182 | bzero (s, n) | - | ||||||
| 183 | char *s; | - | ||||||
| 184 | int n; | - | ||||||
| 185 | { | - | ||||||
| 186 | register int i; | - | ||||||
| 187 | register char *r; | - | ||||||
| 188 | - | |||||||
| 189 | for (i = 0, r = s; i < n; i++) | - | ||||||
| 190 | *r++ = '\0'; | - | ||||||
| 191 | } | - | ||||||
| 192 | #endif | - | ||||||
| 193 | - | |||||||
| 194 | #if !defined (HAVE_GETHOSTNAME) | - | ||||||
| 195 | # if defined (HAVE_UNAME) | - | ||||||
| 196 | # include <sys/utsname.h> | - | ||||||
| 197 | int | - | ||||||
| 198 | gethostname (name, namelen) | - | ||||||
| 199 | char *name; | - | ||||||
| 200 | int namelen; | - | ||||||
| 201 | { | - | ||||||
| 202 | int i; | - | ||||||
| 203 | struct utsname ut; | - | ||||||
| 204 | - | |||||||
| 205 | --namelen; | - | ||||||
| 206 | - | |||||||
| 207 | uname (&ut); | - | ||||||
| 208 | i = strlen (ut.nodename) + 1; | - | ||||||
| 209 | strncpy (name, ut.nodename, i < namelen ? i : namelen); | - | ||||||
| 210 | name[namelen] = '\0'; | - | ||||||
| 211 | return (0); | - | ||||||
| 212 | } | - | ||||||
| 213 | # else /* !HAVE_UNAME */ | - | ||||||
| 214 | int | - | ||||||
| 215 | gethostname (name, namelen) | - | ||||||
| 216 | char *name; | - | ||||||
| 217 | int namelen; | - | ||||||
| 218 | { | - | ||||||
| 219 | strncpy (name, "unknown", namelen); | - | ||||||
| 220 | name[namelen] = '\0'; | - | ||||||
| 221 | return 0; | - | ||||||
| 222 | } | - | ||||||
| 223 | # endif /* !HAVE_UNAME */ | - | ||||||
| 224 | #endif /* !HAVE_GETHOSTNAME */ | - | ||||||
| 225 | - | |||||||
| 226 | #if !defined (HAVE_KILLPG) | - | ||||||
| 227 | int | - | ||||||
| 228 | killpg (pgrp, sig) | - | ||||||
| 229 | pid_t pgrp; | - | ||||||
| 230 | int sig; | - | ||||||
| 231 | { | - | ||||||
| 232 | return (kill (-pgrp, sig)); | - | ||||||
| 233 | } | - | ||||||
| 234 | #endif /* !HAVE_KILLPG */ | - | ||||||
| 235 | - | |||||||
| 236 | #if !defined (HAVE_MKFIFO) && defined (PROCESS_SUBSTITUTION) | - | ||||||
| 237 | int | - | ||||||
| 238 | mkfifo (path, mode) | - | ||||||
| 239 | char *path; | - | ||||||
| 240 | int mode; | - | ||||||
| 241 | { | - | ||||||
| 242 | #if defined (S_IFIFO) | - | ||||||
| 243 | return (mknod (path, (mode | S_IFIFO), 0)); | - | ||||||
| 244 | #else /* !S_IFIFO */ | - | ||||||
| 245 | return (-1); | - | ||||||
| 246 | #endif /* !S_IFIFO */ | - | ||||||
| 247 | } | - | ||||||
| 248 | #endif /* !HAVE_MKFIFO && PROCESS_SUBSTITUTION */ | - | ||||||
| 249 | - | |||||||
| 250 | #define DEFAULT_MAXGROUPS 64 | - | ||||||
| 251 | - | |||||||
| 252 | int | - | ||||||
| 253 | getmaxgroups () | - | ||||||
| 254 | { | - | ||||||
| 255 | static int maxgroups = -1; | - | ||||||
| 256 | - | |||||||
| 257 | if (maxgroups > 0)
| 0-3 | ||||||
| 258 | return maxgroups; never executed: return maxgroups; | 0 | ||||||
| 259 | - | |||||||
| 260 | #if defined (HAVE_SYSCONF) && defined (_SC_NGROUPS_MAX) | - | ||||||
| 261 | maxgroups = sysconf (_SC_NGROUPS_MAX); | - | ||||||
| 262 | #else | - | ||||||
| 263 | # if defined (NGROUPS_MAX) | - | ||||||
| 264 | maxgroups = NGROUPS_MAX; | - | ||||||
| 265 | # else /* !NGROUPS_MAX */ | - | ||||||
| 266 | # if defined (NGROUPS) | - | ||||||
| 267 | maxgroups = NGROUPS; | - | ||||||
| 268 | # else /* !NGROUPS */ | - | ||||||
| 269 | maxgroups = DEFAULT_MAXGROUPS; | - | ||||||
| 270 | # endif /* !NGROUPS */ | - | ||||||
| 271 | # endif /* !NGROUPS_MAX */ | - | ||||||
| 272 | #endif /* !HAVE_SYSCONF || !SC_NGROUPS_MAX */ | - | ||||||
| 273 | - | |||||||
| 274 | if (maxgroups <= 0)
| 0-3 | ||||||
| 275 | maxgroups = DEFAULT_MAXGROUPS; never executed: maxgroups = 64; | 0 | ||||||
| 276 | - | |||||||
| 277 | return maxgroups; executed 3 times by 1 test: return maxgroups;Executed by:
| 3 | ||||||
| 278 | } | - | ||||||
| 279 | - | |||||||
| 280 | long | - | ||||||
| 281 | getmaxchild () | - | ||||||
| 282 | { | - | ||||||
| 283 | static long maxchild = -1L; | - | ||||||
| 284 | - | |||||||
| 285 | if (maxchild > 0)
| 15-5432 | ||||||
| 286 | return maxchild; executed 15 times by 1 test: return maxchild;Executed by:
| 15 | ||||||
| 287 | - | |||||||
| 288 | #if defined (HAVE_SYSCONF) && defined (_SC_CHILD_MAX) | - | ||||||
| 289 | maxchild = sysconf (_SC_CHILD_MAX); | - | ||||||
| 290 | #else | - | ||||||
| 291 | # if defined (CHILD_MAX) | - | ||||||
| 292 | maxchild = CHILD_MAX; | - | ||||||
| 293 | # else | - | ||||||
| 294 | # if defined (MAXUPRC) | - | ||||||
| 295 | maxchild = MAXUPRC; | - | ||||||
| 296 | # endif /* MAXUPRC */ | - | ||||||
| 297 | # endif /* CHILD_MAX */ | - | ||||||
| 298 | #endif /* !HAVE_SYSCONF || !_SC_CHILD_MAX */ | - | ||||||
| 299 | - | |||||||
| 300 | return (maxchild); executed 5432 times by 1 test: return (maxchild);Executed by:
| 5432 | ||||||
| 301 | } | - | ||||||
| Source code | Switch to Preprocessed file |