summaryrefslogtreecommitdiff
path: root/usr/src/make_src/Make/lib/makestate
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/make_src/Make/lib/makestate')
-rw-r--r--usr/src/make_src/Make/lib/makestate/Makefile48
-rw-r--r--usr/src/make_src/Make/lib/makestate/src/Makefile50
-rw-r--r--usr/src/make_src/Make/lib/makestate/src/Variant.mk73
-rw-r--r--usr/src/make_src/Make/lib/makestate/src/ld_file.c192
-rw-r--r--usr/src/make_src/Make/lib/makestate/src/lock.c175
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 */
+}