diff options
Diffstat (limited to 'usr/src/cmd/fmli/sys/tempfiles.c')
-rw-r--r-- | usr/src/cmd/fmli/sys/tempfiles.c | 291 |
1 files changed, 0 insertions, 291 deletions
diff --git a/usr/src/cmd/fmli/sys/tempfiles.c b/usr/src/cmd/fmli/sys/tempfiles.c deleted file mode 100644 index 2c7e1709e6..0000000000 --- a/usr/src/cmd/fmli/sys/tempfiles.c +++ /dev/null @@ -1,291 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2005 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -/* Copyright (c) 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ -/* All Rights Reserved */ - - -#pragma ident "%Z%%M% %I% %E% SMI" - -#include <stdio.h> -#include <stdlib.h> -#include <signal.h> -#include <fcntl.h> -#include <errno.h> -#include <sys/types.h> /* abs k16 */ -#include "wish.h" -#include "retcodes.h" -#include "var_arrays.h" -#include "terror.h" -#include "moremacros.h" - -#define LCKPREFIX ".L" - -/* - * globals used throughout the Telesystem - */ -extern char **Remove; - -static void putdec(pid_t n, int fd); -static int getdec(int fd); - -/* - * make an entry in the Remove table and return its index - */ -static int -makentry(path) -char path[]; -{ - - if (path == NULL) - return (-1); - if (Remove == NULL) - Remove = (char **)array_create(sizeof (char *), 10); - Remove = (char **)array_append(Remove, &path); - return (array_len(Remove) - 1); -} - -/* - * Remove an entry from the Remove table (presumably because - * the file could not be created) - */ -static void -rmentry(ent) -int ent; -{ - register char *ptr; - - ptr = Remove[ent]; - Remove = (char **)array_delete(Remove, ent); - free(ptr); -} - -/* - * create a lockfile and return success - */ -bool -lockfile(path) -char path[]; -{ - register char *save; - register int ent; - register int fd; - register bool success; - char *prefix(); - - if ((save = prefix(path, LCKPREFIX)) == NULL) - fatal(NOMEM, path); - if ((ent = makentry(save)) < 0) { - free(save); - return (FALSE); - } - /* assume we will be successful */ - success = TRUE; - if ((fd = open(save, O_RDONLY)) >= 0) { - register pid_t pid; /* EFT abs k16 */ - - if ((pid = getdec(fd)) < 0 || (kill(pid, 0) && errno == ESRCH)) - unlink(save); - else - /* - * if there's another process active, we won't be - * (unless it's us) - */ - if (pid == getpid()) { - close(fd); - return (TRUE); - } - else - success = FALSE; - close(fd); - } - errno = 0; - /* if we still think we'll be successful, try it for real */ - if (success) - success = ((fd = open(save, O_EXCL | O_CREAT | O_WRONLY, - 0444)) >= 0); - if (success) { - chmod(save, 0444); - putdec(getpid(), fd); - close(fd); - } - else - rmentry(ent); - errno = 0; /* reset */ - return (success); -} - -static void -putdec(pid_t n, int fd) -{ - char buf[16]; - - sprintf(buf, "%d\n", n); - write(fd, buf, strlen(buf)); -} - -static int -getdec(int fd) -{ - char buf[16]; - register int n; - register pid_t pid; /* EFT abs k16 */ - - n = read(fd, buf, sizeof (buf)); - if (n > 1 && buf[n - 1] == '\n' && - (pid = (pid_t)strtol(buf, (char **)NULL, 0)) > 1) /* EFT abs k16 */ - return (pid); - else - return (-1); -} - -/* - * Remove lockfile created by "lockfile()" - */ -void -unlock(path) -char *path; -{ - register char *save; - register int n; - char *prefix(); - int lcv; - - if ((save = prefix(path, LCKPREFIX)) == NULL) - return; - unlink(save); - lcv = array_len(Remove); - for (n = 0; n < lcv; n++) - if (strcmp(save, Remove[n]) == 0) { - rmentry(n); - break; - } - free(save); -} - -/* - * eopen performs an fopen/fdopen with some good things added for temp files - * If the mode starts with "t" the file will be unlinked immediately - * after creation. If the mode starts with "T", the file will be - * removed when the program exits - normally or from the receipt - * of signal 1, 2, 3, or 15. - * SIDE EFFECT: for temp files, calls "mkstemp(3)" on "path" - */ -FILE * -eopen(path, mode) -char path[]; -char mode[]; -{ - register int ent; - register FILE *fp; - int tmpfd = -1; - - switch (mode[0]) { - case 'T': - case 't': - if ((tmpfd = mkstemp(path)) == -1) - return (NULL); - (void) close(tmpfd); - if ((ent = makentry(strsave(path))) < 0) - return (NULL); - fp = fopen(path, mode + 1); - if (mode[0] == 't' && unlink(path) == 0) - rmentry(ent); - break; - default: - fp = fopen(path, mode); - break; - } - return (fp); -} - -/* - * for compatibility's sake - */ -void -eclose(fp) -FILE *fp; -{ - fclose(fp); -} - -/* - * make a tempfile using "eopen()" - * if the path is null, one is provided - * if the mode starts with neither "t" nor "T" - * it defaults to "t" - */ -FILE * -tempfile(path, mode) -char path[]; -char mode[]; -{ - char newmode[8]; - char save[20]; /* based on length of string below */ - - if (path == NULL) { - path = save; - strcpy(path, "/tmp/wishXXXXXX"); - } - if (mode[0] != 't' && mode[0] != 'T') { - newmode[0] = 't'; - strncpy(newmode + 1, mode, sizeof (mode) - 2); - newmode[sizeof (mode) - 1] = '\0'; - mode = newmode; - } - return (eopen(path, mode)); -} - -char * -prefx(path, prfx) -char *path; -char *prfx; -{ - register int len; - char *filename(); - register char *p, *q; - - p = filename(path); - len = strlen(prfx); - for (q = path + strlen(path) + len; q >= p; q--) - *q = *(q - len); - strncpy(p, prfx, len); - return (path); -} -char * -prefix(path, prfx) -char *path; -char *prfx; -{ - register char *ret; - - if ((ret = malloc(strlen(path) + strlen(prfx) + 1)) != NULL) { - strcpy(ret, path); - return (prefx(ret, prfx)); - } - return (ret); -} |