diff options
| author | mycroft <mycroft@NetBSD.org> | 1998-07-27 13:42:27 +0000 |
|---|---|---|
| committer | mycroft <mycroft@NetBSD.org> | 1998-07-27 13:42:27 +0000 |
| commit | 201e4eaca0c9e7f8a1f0e0bab7b420dbd39e763a (patch) | |
| tree | 656cb4310c1887427cd938686642ec680681d201 /lib/libc/stdio | |
| parent | 82370f62b3830a534589acfdcd7277148e24b9c5 (diff) | |
If AUDIT, do not compile certain functions.
Diffstat (limited to 'lib/libc/stdio')
| -rw-r--r-- | lib/libc/stdio/gettemp.c | 150 | ||||
| -rw-r--r-- | lib/libc/stdio/local.h | 4 | ||||
| -rw-r--r-- | lib/libc/stdio/mkstemp.c | 57 | ||||
| -rw-r--r-- | lib/libc/stdio/mktemp.c | 121 |
4 files changed, 214 insertions, 118 deletions
diff --git a/lib/libc/stdio/gettemp.c b/lib/libc/stdio/gettemp.c new file mode 100644 index 00000000000..e713fd14728 --- /dev/null +++ b/lib/libc/stdio/gettemp.c @@ -0,0 +1,150 @@ +/* $NetBSD: gettemp.c,v 1.1 1998/07/27 13:42:39 mycroft Exp $ */ + +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: gettemp.c,v 1.1 1998/07/27 13:42:39 mycroft Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> +#include <unistd.h> +#include <errno.h> +#include "local.h" + +int +__gettemp(path, doopen) + char *path; + int *doopen; +{ + char *start, *trv; + struct stat sbuf; + u_int pid; + + /* To guarantee multiple calls generate unique names even if + the file is not created. 676 different possibilities with 7 + or more X's, 26 with 6 or less. */ + static char xtra[2] = "aa"; + int xcnt = 0; + + pid = getpid(); + + /* Move to end of path and count trailing X's. */ + for (trv = path; *trv; ++trv) + if (*trv == 'X') + xcnt++; + else + xcnt = 0; + + /* Use at least one from xtra. Use 2 if more than 6 X's. */ + if (*(trv-1) == 'X') + *--trv = xtra[0]; + if (xcnt > 6 && *(trv-1) == 'X') + *--trv = xtra[1]; + + /* Set remaining X's to pid digits with 0's to the left. */ + while (*--trv == 'X') { + *trv = (pid % 10) + '0'; + pid /= 10; + } + + /* update xtra for next call. */ + if (xtra[0] != 'z') + xtra[0]++; + else { + xtra[0] = 'a'; + if (xtra[1] != 'z') + xtra[1]++; + else + xtra[1] = 'a'; + } + + /* + * check the target directory; if you have six X's and it + * doesn't exist this runs for a *very* long time. + */ + for (start = trv + 1;; --trv) { + if (trv <= path) + break; + if (*trv == '/') { + *trv = '\0'; + if (stat(path, &sbuf)) + return (0); + if (!S_ISDIR(sbuf.st_mode)) { + errno = ENOTDIR; + return (0); + } + *trv = '/'; + break; + } + } + + for (;;) { + if (doopen) { + if ((*doopen = + open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0) + return (1); + if (errno != EEXIST) + return (0); + } + else if (lstat(path, &sbuf)) + return (errno == ENOENT ? 1 : 0); + + /* tricky little algorithm for backward compatibility */ + for (trv = start;;) { + if (!*trv) + return (0); + if (*trv == 'z') + *trv++ = 'a'; + else { + if (isdigit(*trv)) + *trv = 'a'; + else + ++*trv; + break; + } + } + } + /*NOTREACHED*/ +} diff --git a/lib/libc/stdio/local.h b/lib/libc/stdio/local.h index 0af4169a541..3cc4a8b68a7 100644 --- a/lib/libc/stdio/local.h +++ b/lib/libc/stdio/local.h @@ -1,4 +1,4 @@ -/* $NetBSD: local.h,v 1.7 1998/02/02 03:32:52 perry Exp $ */ +/* $NetBSD: local.h,v 1.8 1998/07/27 13:42:27 mycroft Exp $ */ /*- * Copyright (c) 1990, 1993 @@ -62,6 +62,8 @@ extern int __sflags __P((const char *, int *)); extern int __sdidinit; +extern int __gettemp __P((char *, int *)); + /* * Return true iff the given FILE cannot be written now. */ diff --git a/lib/libc/stdio/mkstemp.c b/lib/libc/stdio/mkstemp.c new file mode 100644 index 00000000000..e1784547a54 --- /dev/null +++ b/lib/libc/stdio/mkstemp.c @@ -0,0 +1,57 @@ +/* $NetBSD: mkstemp.c,v 1.1 1998/07/27 13:42:39 mycroft Exp $ */ + +/* + * Copyright (c) 1987, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <sys/cdefs.h> +#if defined(LIBC_SCCS) && !defined(lint) +#if 0 +static char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93"; +#else +__RCSID("$NetBSD: mkstemp.c,v 1.1 1998/07/27 13:42:39 mycroft Exp $"); +#endif +#endif /* LIBC_SCCS and not lint */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include "local.h" + +int +mkstemp(path) + char *path; +{ + int fd; + + return (__gettemp(path, &fd) ? fd : -1); +} diff --git a/lib/libc/stdio/mktemp.c b/lib/libc/stdio/mktemp.c index 928fd510a4a..b338b0c6dce 100644 --- a/lib/libc/stdio/mktemp.c +++ b/lib/libc/stdio/mktemp.c @@ -1,4 +1,4 @@ -/* $NetBSD: mktemp.c,v 1.12 1998/06/01 20:17:50 kleink Exp $ */ +/* $NetBSD: mktemp.c,v 1.13 1998/07/27 13:42:27 mycroft Exp $ */ /* * Copyright (c) 1987, 1993 @@ -38,37 +38,20 @@ #if 0 static char sccsid[] = "@(#)mktemp.c 8.1 (Berkeley) 6/4/93"; #else -__RCSID("$NetBSD: mktemp.c,v 1.12 1998/06/01 20:17:50 kleink Exp $"); +__RCSID("$NetBSD: mktemp.c,v 1.13 1998/07/27 13:42:27 mycroft Exp $"); #endif #endif /* LIBC_SCCS and not lint */ -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> #include <stdio.h> #include <stdlib.h> -#include <ctype.h> #include <unistd.h> -#include <errno.h> #include "local.h" -static int _gettemp __P((char *, int *)); - -int -mkstemp(path) - char *path; -{ - int fd; - - return (_gettemp(path, &fd) ? fd : -1); -} - char * _mktemp(path) char *path; { - return (_gettemp(path, (int *)NULL) ? path : (char *)NULL); + return (__gettemp(path, (int *)NULL) ? path : (char *)NULL); } __warn_references(mktemp, @@ -78,101 +61,5 @@ char * mktemp(path) char *path; { - return (_gettemp(path, (int *)NULL) ? path : (char *)NULL); -} - -static int -_gettemp(path, doopen) - char *path; - int *doopen; -{ - char *start, *trv; - struct stat sbuf; - u_int pid; - - /* To guarantee multiple calls generate unique names even if - the file is not created. 676 different possibilities with 7 - or more X's, 26 with 6 or less. */ - static char xtra[2] = "aa"; - int xcnt = 0; - - pid = getpid(); - - /* Move to end of path and count trailing X's. */ - for (trv = path; *trv; ++trv) - if (*trv == 'X') - xcnt++; - else - xcnt = 0; - - /* Use at least one from xtra. Use 2 if more than 6 X's. */ - if (*(trv-1) == 'X') - *--trv = xtra[0]; - if (xcnt > 6 && *(trv-1) == 'X') - *--trv = xtra[1]; - - /* Set remaining X's to pid digits with 0's to the left. */ - while (*--trv == 'X') { - *trv = (pid % 10) + '0'; - pid /= 10; - } - - /* update xtra for next call. */ - if (xtra[0] != 'z') - xtra[0]++; - else { - xtra[0] = 'a'; - if (xtra[1] != 'z') - xtra[1]++; - else - xtra[1] = 'a'; - } - - /* - * check the target directory; if you have six X's and it - * doesn't exist this runs for a *very* long time. - */ - for (start = trv + 1;; --trv) { - if (trv <= path) - break; - if (*trv == '/') { - *trv = '\0'; - if (stat(path, &sbuf)) - return (0); - if (!S_ISDIR(sbuf.st_mode)) { - errno = ENOTDIR; - return (0); - } - *trv = '/'; - break; - } - } - - for (;;) { - if (doopen) { - if ((*doopen = - open(path, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0) - return (1); - if (errno != EEXIST) - return (0); - } - else if (lstat(path, &sbuf)) - return (errno == ENOENT ? 1 : 0); - - /* tricky little algorithm for backward compatibility */ - for (trv = start;;) { - if (!*trv) - return (0); - if (*trv == 'z') - *trv++ = 'a'; - else { - if (isdigit(*trv)) - *trv = 'a'; - else - ++*trv; - break; - } - } - } - /*NOTREACHED*/ + return (__gettemp(path, (int *)NULL) ? path : (char *)NULL); } |
