diff options
Diffstat (limited to 'usr/src/make_src/Make/lib/makestate')
-rw-r--r-- | usr/src/make_src/Make/lib/makestate/Makefile | 48 | ||||
-rw-r--r-- | usr/src/make_src/Make/lib/makestate/src/Makefile | 50 | ||||
-rw-r--r-- | usr/src/make_src/Make/lib/makestate/src/Variant.mk | 73 | ||||
-rw-r--r-- | usr/src/make_src/Make/lib/makestate/src/ld_file.c | 192 | ||||
-rw-r--r-- | usr/src/make_src/Make/lib/makestate/src/lock.c | 175 |
5 files changed, 538 insertions, 0 deletions
diff --git a/usr/src/make_src/Make/lib/makestate/Makefile b/usr/src/make_src/Make/lib/makestate/Makefile new file mode 100644 index 0000000..9c1ddf0 --- /dev/null +++ b/usr/src/make_src/Make/lib/makestate/Makefile @@ -0,0 +1,48 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (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 2004 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# @(#)Makefile 1.7 06/12/12 +# + +TOP = ../../.. +include $(TOP)/rules/variant.mk + +V9_VARIANT :sh= \ +if [ -x /usr/bin/isalist ] ; \ +then \ + for f in `/usr/bin/isalist` ; \ + do \ + if [ "$f" = sparcv9 ] ; \ + then \ + echo sparcv9 ; \ + break ; \ + fi ; \ + if [ "$f" = amd64 ] ; \ + then \ + echo amd64-S2 ; \ + break ; \ + fi ; \ + done ; \ +fi + +include $(TOP)/rules/derived.mk diff --git a/usr/src/make_src/Make/lib/makestate/src/Makefile b/usr/src/make_src/Make/lib/makestate/src/Makefile new file mode 100644 index 0000000..21e239d --- /dev/null +++ b/usr/src/make_src/Make/lib/makestate/src/Makefile @@ -0,0 +1,50 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (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 1996 Sun Microsystems, Inc. All rights reserved. +# Use is subject to license terms. +# +# @(#)Makefile 1.5 06/12/12 +# +# @(#)Makefile 1.1 96/03/11 SMI + +# Generic makefile for use in src directories. Knows how to make common things +# in the right $(VARIANT) directory. + +include $(TOP)/rules/variant.mk + +all := TARG = all +install := TARG = install +clean := TARG = clean +test := TARG = test +l10n_install := TARG = l10n_install +i18n_install := TARG = i18n_install + +SRC = ../src +MFLAGS += SRC=$(SRC) + +# See $(TOP)/rules/master.mk for how these are built. +%.h %.cc %.C %.E %.o all install clean test l10n_install i18n_install: FRC + @ if [ ! -d ../$(VARIANT) ]; then \ + mkdir ../$(VARIANT) ; \ + fi + cd ../$(VARIANT); $(MAKE) $(MFLAGS) -f $(SRC)/Variant.mk DESTDIR=$(DESTDIR) $@ + +FRC: diff --git a/usr/src/make_src/Make/lib/makestate/src/Variant.mk b/usr/src/make_src/Make/lib/makestate/src/Variant.mk new file mode 100644 index 0000000..26971d5 --- /dev/null +++ b/usr/src/make_src/Make/lib/makestate/src/Variant.mk @@ -0,0 +1,73 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (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. +# +# @(#)Variant.mk 1.12 06/12/12 +# + +TOP = ../../../.. + +%.o: $(SRC)/%.c + $(COMPILE.c) $(OUTPUT_OPTION) $< + +include $(TOP)/rules/master.mk + +PKG_TOP = $(TOP)/Make + +CSRCS = \ + ld_file.c \ + lock.c + +LIBNAME = libmakestate.a +DLIBNAME = libmakestate.so.1 +MSG_FILE = libmakestate.msg +I18N_DIRS = $(SRC) + +CFLAGS += $(V9FLAGS) -KPIC -DTEXT_DOMAIN=\"SUNW_OST_OSLIB\" +CPPFLAGS= + +#include $(TOP)/Make/lib/Lib.mk +include $(TOP)/rules/lib.mk + +POUND_SIGN:sh= echo \# +RELEASE= 5.11 +VERSION= $(RELEASE_VER) +PATCHID= $(VERSION) +DATE:sh = date '+%B %Y' +RELEASE_DATE= $(DATE) +PATCH_DATE= $(RELEASE_DATE) +RELEASE_CM= "@($(POUND_SIGN))RELEASE VERSION SunOS $(RELEASE) $(PATCHID) $(PATCH_DATE)" + +PROCESS_COMMENT= mcs -a $(RELEASE_CM) +POST_PROCESS_SO= $(PROCESS_COMMENT) $@ + +$(DLIBNAME) : $(LIBNAME) + $(CC) $(V9FLAGS) -o $@ -dy -G -ztext -h $@ ld_file.o lock.o -lelf + mcs -d $@ + ${POST_PROCESS_SO} + +all: $(DLIBNAME) + +install: all + ${INSTALL} -d ${DESTDIR}/usr/lib$(VAR_DIR) + ${RM} ${DESTDIR}/usr/lib$(VAR_DIR)/$(DLIBNAME) + ${INSTALL} $(DLIBNAME) ${DESTDIR}/usr/lib$(VAR_DIR) diff --git a/usr/src/make_src/Make/lib/makestate/src/ld_file.c b/usr/src/make_src/Make/lib/makestate/src/ld_file.c new file mode 100644 index 0000000..b80ea68 --- /dev/null +++ b/usr/src/make_src/Make/lib/makestate/src/ld_file.c @@ -0,0 +1,192 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (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 1998 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ +/* + * @(#)ld_file.c 1.7 06/12/12 + */ +#pragma ident "@(#)ld_file.c 1.7 06/12/12" + +#pragma init(ld_support_init) + +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <libelf.h> +#include <sys/param.h> +#include <link.h> + +#define SUNPRO_DEPENDENCIES "SUNPRO_DEPENDENCIES" + +/* + * Linked list of strings - used to keep lists of names + * of directories or files. + */ + +struct Stritem { + char * str; + void * next; +}; + +typedef struct Stritem Stritem; + +static char * depend_file = NULL; +static Stritem * list = NULL; + + +void mk_state_init() +{ + depend_file = getenv(SUNPRO_DEPENDENCIES); +} /* mk_state_init() */ + + + +static void +prepend_str(Stritem **list, const char * str) +{ + Stritem * new; + char * newstr; + + if (!(new = calloc(1, sizeof (Stritem)))) { + perror("libmakestate.so"); + return; + } /* if */ + + if (!(newstr = malloc(strlen(str) + 1))) { + perror("libmakestate.so"); + return; + } /* if */ + + new->str = strcpy(newstr, str); + new->next = *list; + *list = new; + +} /* prepend_str() */ + + +void +mk_state_collect_dep(const char * file) +{ + /* + * SUNPRO_DEPENDENCIES wasn't set, we don't collect .make.state + * information. + */ + if (!depend_file) + return; + + prepend_str(&list, file); + +} /* mk_state_collect_dep() */ + + +void +mk_state_update_exit() +{ + Stritem * cur; + char lockfile[MAXPATHLEN], * err, * space, * target; + FILE * ofp; + extern char * file_lock(char *, char *, int); + + if (!depend_file) + return; + + if ((space = strchr(depend_file, ' ')) == NULL) + return; + *space = '\0'; + target = &space[1]; + + (void) sprintf(lockfile, "%s.lock", depend_file); + if ((err = file_lock(depend_file, lockfile, 0))) { + (void) fprintf(stderr, "%s\n", err); + return; + } /* if */ + + if (!(ofp = fopen(depend_file, "a"))) + return; + + if (list) + (void) fprintf(ofp, "%s: ", target); + + for (cur = list; cur; cur = cur->next) + (void) fprintf(ofp, " %s", cur->str); + + (void) fputc('\n', ofp); + + (void) fclose(ofp); + (void) unlink(lockfile); + *space = ' '; + +} /* mk_state_update_exit() */ + +static void +/* LINTED static unused */ +ld_support_init() +{ + mk_state_init(); + +} /* ld_support_init() */ + +/* ARGSUSED */ +void +ld_file(const char * file, const Elf_Kind ekind, int flags, Elf *elf) +{ + if(! ((flags & LD_SUP_DERIVED) && !(flags & LD_SUP_EXTRACTED))) + return; + + mk_state_collect_dep(file); + +} /* ld_file */ + +void +ld_atexit(int exit_code) +{ + if (exit_code) + return; + + mk_state_update_exit(); + +} /* ld_atexit() */ + +/* + * Supporting 64-bit objects + */ +void +ld_file64(const char * file, const Elf_Kind ekind, int flags, Elf *elf) +{ + if(! ((flags & LD_SUP_DERIVED) && !(flags & LD_SUP_EXTRACTED))) + return; + + mk_state_collect_dep(file); + +} /* ld_file64 */ + +void +ld_atexit64(int exit_code) +{ + if (exit_code) + return; + + mk_state_update_exit(); + +} /* ld_atexit64() */ diff --git a/usr/src/make_src/Make/lib/makestate/src/lock.c b/usr/src/make_src/Make/lib/makestate/src/lock.c new file mode 100644 index 0000000..7646059 --- /dev/null +++ b/usr/src/make_src/Make/lib/makestate/src/lock.c @@ -0,0 +1,175 @@ +/* + * CDDL HEADER START + * + * The contents of this file are subject to the terms of the + * Common Development and Distribution License (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 2004 Sun Microsystems, Inc. All rights reserved. + * Use is subject to license terms. + */ +/* + * @(#)lock.c 1.5 06/12/12 + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <fcntl.h> +#include <sys/types.h> +#include <sys/param.h> +#include <sys/stat.h> +#include <sys/errno.h> +#include <errno.h> /* errno */ + +#if defined(_LP64) +/* + * The symbols _sys_errlist and _sys_nerr are not visible in the + * LP64 libc. Use strerror(3C) instead. + */ +#else /* #_LP64 */ +extern char * sys_errlist[]; +extern int sys_nerr; +#endif /* #_LP64 */ + +static void file_lock_error(); + +/* + * This code stolen from the NSE library and changed to not depend + * upon any NSE routines or header files. + * + * Simple file locking. + * Create a symlink to a file. The "test and set" will be + * atomic as creating the symlink provides both functions. + * + * The timeout value specifies how long to wait for stale locks + * to disappear. If the lock is more than 'timeout' seconds old + * then it is ok to blow it away. This part has a small window + * of vunerability as the operations of testing the time, + * removing the lock and creating a new one are not atomic. + * It would be possible for two processes to both decide to blow + * away the lock and then have process A remove the lock and establish + * its own, and then then have process B remove the lock which accidentily + * removes A's lock rather than the stale one. + * + * A further complication is with the NFS. If the file in question is + * being served by an NFS server, then its time is set by that server. + * We can not use the time on the client machine to check for a stale + * lock. Therefore, a temp file on the server is created to get + * the servers current time. + * + * Returns an error message. NULL return means the lock was obtained. + * + */ +char * +file_lock(char * name, char * lockname, int timeout) +{ + int r; + int fd; + struct stat statb; + struct stat fs_statb; + char tmpname[MAXPATHLEN]; + static char msg[MAXPATHLEN]; + + if (timeout <= 0) { + timeout = 15; + } + for (;;) { + r = symlink(name, lockname); + if (r == 0) { + return (NULL); + } + if (errno != EEXIST) { + file_lock_error(msg, name, + (const char *)"symlink(%s, %s)", name, lockname); + return (msg); + } + for (;;) { + (void) sleep(1); + r = lstat(lockname, &statb); + if (r == -1) { + /* + * The lock must have just gone away - try + * again. + */ + break; + } + + /* + * With the NFS the time given a file is the time on + * the file server. This time may vary from the + * client's time. Therefore, we create a tmpfile in + * the same directory to establish the time on the + * server and use this time to see if the lock has + * expired. + */ + (void) sprintf(tmpname, "%s.XXXXXX", lockname); + (void) mktemp(tmpname); + fd = creat(tmpname, 0666); + if (fd != -1) { + (void) close(fd); + } else { + file_lock_error(msg, name, + (const char *)"creat(%s)", tmpname); + return (msg); + } + if (stat(tmpname, &fs_statb) == -1) { + file_lock_error(msg, name, + (const char *)"stat(%s)", tmpname); + return (msg); + } + (void) unlink(tmpname); + if (statb.st_mtime + timeout < fs_statb.st_mtime) { + /* + * The lock has expired - blow it away. + */ + (void) unlink(lockname); + break; + } + } + } + /* NOTREACHED */ +} + +/* + * Format a message telling why the lock could not be created. + */ +/* VARARGS4 */ +static void +file_lock_error(char * msg, char * file, const char * str, char * arg1, + char * arg2) +{ + int len; + + (void) sprintf(msg, "Could not lock file `%s'; ", file); + len = strlen(msg); + (void) sprintf(&msg[len], str, arg1, arg2); + (void) strcat(msg, " failed - "); +#if defined(_LP64) + /* Needs to be changed to use strerror(3C) instead. */ + len = strlen(msg); + (void) sprintf(&msg[len], "errno %d", errno); +#else /* #_LP64 */ + if (errno < sys_nerr) { + (void) strcat(msg, sys_errlist[errno]); + } else { + len = strlen(msg); + (void) sprintf(&msg[len], "errno %d", errno); + } +#endif /* #_LP64 */ +} |