]> Zhao Yanbai Git Server - minix.git/commitdiff
Important BSD version of setenv, added killpg, replaced _sigsetjmp.c with
authorPhilip Homburg <philip@cs.vu.nl>
Wed, 7 Jun 2006 14:38:39 +0000 (14:38 +0000)
committerPhilip Homburg <philip@cs.vu.nl>
Wed, 7 Jun 2006 14:38:39 +0000 (14:38 +0000)
an assembler jump to longjmp.

lib/other/setenv.c
lib/posix/Makefile.in
lib/posix/_killpg.c [new file with mode: 0644]
lib/posix/_sigsetjmp.c [deleted file]
lib/syscall/Makefile.in
lib/syscall/killpg.s [new file with mode: 0644]
lib/syscall/siglongjmp.s [new file with mode: 0644]

index b734a983afceecb89ead836d4c554b4ab514c881..2c0dbfce709b6babd0226ad66b6e6f1a8d7b2288 100755 (executable)
+/*
+ * 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       <stdlib.h>
-#include       <string.h>
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)setenv.c   8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
 
-int
-setenv(const char *name, const char *val, int overwrite)
+#include <errno.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *__findenv(const char *, int *);
+
+/*
+ * setenv --
+ *     Set the value of the environmental variable "name" to be
+ *     "value".  If rewrite is set, replace any current value.
+ */
+setenv(name, value, rewrite)
+       register const char *name;
+       register const char *value;
+       int rewrite;
 {
-       char *bf;
-       int r;
+       extern char **environ;
+       static int alloced;                     /* if allocated space before */
+       register char *c;
+       int l_value, offset;
 
-       if(!overwrite && getenv(name))
-               return 0;
+       if (*value == '=')                      /* no `=' in value */
+               ++value;
+       l_value = strlen(value);
+       if ((c = __findenv(name, &offset))) {   /* find if already exists */
+               if (!rewrite)
+                       return (0);
+               if (strlen(c) >= l_value) {     /* old larger; copy over */
+                       while (*c++ = *value++);
+                       return (0);
+               }
+       } else {                                        /* create new slot */
+               register int cnt;
+               register char **p;
 
-       if(!(bf=malloc(strlen(name)+strlen(val)+2)))
-               return -1;
+               for (p = environ, cnt = 0; *p; ++p, ++cnt);
+               if (alloced) {                  /* just increase size */
+                       environ = (char **)realloc((char *)environ,
+                           (size_t)(sizeof(char *) * (cnt + 2)));
+                       if (!environ)
+                               return (-1);
+               }
+               else {                          /* get new space */
+                       alloced = 1;            /* copy old entries into it */
+                       p = malloc((size_t)(sizeof(char *) * (cnt + 2)));
+                       if (!p)
+                               return (-1);
+                       memcpy(p, environ, cnt * sizeof(char *));
+                       environ = p;
+               }
+               environ[cnt + 1] = NULL;
+               offset = cnt;
+       }
+       for (c = (char *)name; *c && *c != '='; ++c);   /* no `=' in name */
+       if (!(environ[offset] =                 /* name + `=' + value */
+           malloc((size_t)((int)(c - name) + l_value + 2))))
+               return (-1);
+       for (c = environ[offset]; (*c = *name++) && *c != '='; ++c);
+       for (*c++ = '='; *c++ = *value++;);
+       return (0);
+}
 
-       strcpy(bf, name);
-       strcat(bf, "=");
-       strcat(bf, val);
+/*
+ * unsetenv(name) --
+ *     Delete environmental variable "name".
+ */
+int
+unsetenv(name)
+       const char *name;
+{
+       extern char **environ;
+       register char **p;
+       int offset;
 
-       r = putenv(bf);
+       if (name == NULL || strlen(name) == 0 || strchr(name, '=') != 0)
+       {
+               errno= EINVAL;
+               return -1;
+       }
 
-       return r == 0 ? 0 : -1;
+       while (__findenv(name, &offset))        /* if set multiple times */
+               for (p = &environ[offset];; ++p)
+                       if (!(*p = *(p + 1)))
+                               break;
+       return 0;
 }
 
+/*
+ * __findenv --
+ *     Returns pointer to value associated with name, if any, else NULL.
+ *     Sets offset to be the offset of the name/value combination in the
+ *     environmental array, for use by setenv(3) and unsetenv(3).
+ *     Explicitly removes '=' in argument name.
+ *
+ *     This routine *should* be a static; don't use it.
+ */
+char *
+__findenv(name, offset)
+       register const char *name;
+       int *offset;
+{
+       extern char **environ;
+       register int len;
+       register const char *np;
+       register char **p, *c;
+
+       if (name == NULL || environ == NULL)
+               return (NULL);
+       for (np = name; *np && *np != '='; ++np)
+               continue;
+       len = np - name;
+       for (p = environ; (c = *p) != NULL; ++p)
+               if (strncmp(c, name, len) == 0 && c[len] == '=') {
+                       *offset = p - environ;
+                       return (c + len + 1);
+               }
+       return (NULL);
+}
+/*
+ * $PchId: setenv.c,v 1.3 1996/05/09 20:43:02 philip Exp philip $
+ */
index 3e95fc7124871fb0bf8614ac1273e9e2f5324236..7d6abc211e059da179647c8bba214724552551cf 100644 (file)
@@ -47,6 +47,7 @@ libc_FILES=" \
        _ioctl.c \
        _isatty.c \
        _kill.c \
+       _killpg.c \
        _link.c \
        _lseek.c \
        _lstat.c \
@@ -75,7 +76,6 @@ libc_FILES=" \
        _sigprocmask.c \
        _sigreturn.c \
        _sigset.c \
-       _sigsetjmp.c \
        _sigsuspend.c \
        _sleep.c \
        _stat.c \
diff --git a/lib/posix/_killpg.c b/lib/posix/_killpg.c
new file mode 100644 (file)
index 0000000..ed511b6
--- /dev/null
@@ -0,0 +1,13 @@
+#include <lib.h>
+#define killpg _killpg
+#define kill   _kill
+#include <signal.h>
+
+PUBLIC int killpg(pgrp, sig)
+int pgrp;                      /* which process group is to be sent the
+                                * signal
+                                */
+int sig;                       /* signal number */
+{
+  return kill(-pgrp, sig);
+}
diff --git a/lib/posix/_sigsetjmp.c b/lib/posix/_sigsetjmp.c
deleted file mode 100755 (executable)
index f04cf01..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-#include <lib.h>
-#include <sys/sigcontext.h>
-#include <setjmp.h>
-
-PUBLIC void siglongjmp(env, val)
-sigjmp_buf env;
-int val;
-{
-  if (env[0].__flags & SC_SIGCONTEXT)
-       longjmp(env, val);
-  else
-       _longjmp(env, val);
-}
index ceb1d9d096baa038c2e74fdb932037ac42f7c979..3bfbf2eb5525ec617b7e040726935ca3bd789848 100644 (file)
@@ -53,6 +53,7 @@ libc_FILES=" \
        ioctl.s \
        isatty.s \
        kill.s \
+       killpg.s \
        link.s \
        lseek.s \
        lstat.s \
@@ -84,6 +85,7 @@ libc_FILES=" \
        sigemptyset.s \
        sigfillset.s \
        sigismember.s \
+       siglongjmp.s \
        sigpending.s \
        sigprocmask.s \
        sigreturn.s \
diff --git a/lib/syscall/killpg.s b/lib/syscall/killpg.s
new file mode 100644 (file)
index 0000000..a531137
--- /dev/null
@@ -0,0 +1,7 @@
+.sect .text
+.extern        __killpg
+.define        _killpg
+.align 2
+
+_killpg:
+       jmp     __killpg
diff --git a/lib/syscall/siglongjmp.s b/lib/syscall/siglongjmp.s
new file mode 100644 (file)
index 0000000..914b293
--- /dev/null
@@ -0,0 +1,7 @@
+.sect .text
+.extern        _longjmp
+.define        _siglongjmp
+.align 2
+
+_siglongjmp:
+       jmp     _longjmp