aboutsummaryrefslogtreecommitdiff
path: root/posix
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-02-18 01:27:10 +0000
committerRoland McGrath <roland@gnu.org>1995-02-18 01:27:10 +0000
commit28f540f45bbacd939bfd07f213bcad2bf730b1bf (patch)
tree15f07c4c43d635959c6afee96bde71fb1b3614ee /posix
downloadglibc-28f540f45bbacd939bfd07f213bcad2bf730b1bf.tar.xz
glibc-28f540f45bbacd939bfd07f213bcad2bf730b1bf.zip
initial import
Diffstat (limited to 'posix')
-rw-r--r--posix/.cvsignore4
-rw-r--r--posix/Makefile84
-rw-r--r--posix/confstr.c54
-rw-r--r--posix/execl.c48
-rw-r--r--posix/execle.c45
-rw-r--r--posix/execlp.c44
-rw-r--r--posix/execv.c31
-rw-r--r--posix/execvp.c112
-rw-r--r--posix/fnmatch.c200
-rw-r--r--posix/fnmatch.h67
-rw-r--r--posix/getconf.c134
-rw-r--r--posix/getopt.c759
-rw-r--r--posix/getopt.h133
-rw-r--r--posix/getopt1.c191
-rw-r--r--posix/glob.c671
-rw-r--r--posix/glob.h97
-rw-r--r--posix/glob/.cvsignore1
-rw-r--r--posix/glob/Makefile.in66
-rwxr-xr-xposix/glob/configure1123
-rw-r--r--posix/glob/configure.bat23
-rw-r--r--posix/glob/configure.in19
-rw-r--r--posix/gnu/types.h84
-rw-r--r--posix/id.c173
-rw-r--r--posix/posix1_lim.h87
-rw-r--r--posix/posix2_lim.h82
-rw-r--r--posix/sys/times.h54
-rw-r--r--posix/sys/types.h114
-rw-r--r--posix/sys/unistd.h1
-rw-r--r--posix/sys/utsname.h64
-rw-r--r--posix/sys/wait.h151
-rw-r--r--posix/tar.h110
-rw-r--r--posix/testfnm.args1
-rw-r--r--posix/testfnm.c12
-rw-r--r--posix/tstgetopt.args1
-rw-r--r--posix/tstgetopt.c41
-rw-r--r--posix/unistd.h642
-rw-r--r--posix/wordexp.c184
-rw-r--r--posix/wordexp.h66
38 files changed, 5773 insertions, 0 deletions
diff --git a/posix/.cvsignore b/posix/.cvsignore
new file mode 100644
index 0000000000..1f69fd919a
--- /dev/null
+++ b/posix/.cvsignore
@@ -0,0 +1,4 @@
+*.gz *.Z *.tar *.tgz
+=*
+TODO COPYING* AUTHORS copyr-* copying.*
+glibc-*
diff --git a/posix/Makefile b/posix/Makefile
new file mode 100644
index 0000000000..b6851b99f3
--- /dev/null
+++ b/posix/Makefile
@@ -0,0 +1,84 @@
+# Copyright (C) 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+# This file is part of the GNU C Library.
+
+# The GNU C Library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public License as
+# published by the Free Software Foundation; either version 2 of the
+# License, or (at your option) any later version.
+
+# The GNU C Library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+
+# You should have received a copy of the GNU Library General Public
+# License along with the GNU C Library; see the file COPYING.LIB. If
+# not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+# Cambridge, MA 02139, USA.
+
+#
+# Sub-makefile for POSIX portion of the library.
+#
+subdir := posix
+
+headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \
+ glob.h wordexp.h fnmatch.h gnu/types.h getopt.h \
+ posix1_lim.h posix2_lim.h posix_opt.h local_lim.h tar.h \
+ utsnamelen.h confname.h waitflags.h waitstatus.h sys/unistd.h
+
+distribute := confstr.h
+
+routines := \
+ uname \
+ times \
+ wait waitpid wait3 wait4 \
+ alarm sleep pause \
+ fork vfork _exit \
+ execve fexecve execv execle execl execvp execlp \
+ getpid getppid \
+ getuid geteuid getgid getegid getgroups setuid setgid \
+ getpgid setpgid getpgrp setsid \
+ getlogin setlogin \
+ pathconf sysconf fpathconf \
+ glob fnmatch \
+ confstr \
+ getopt getopt1
+aux := init-posix
+tests := tstgetopt testfnm
+others := getconf
+install-bin := getconf
+install-lib := libposix.a
+gpl2lgpl := getopt.c getopt1.c getopt.h # Frob these guys' copying notices.
+
+include ../Rules
+
+$(objpfx)libposix.a: $(dep-dummy-lib); $(make-dummy-lib)
+lib: $(objpfx)libposix.a
+
+# Make the standalone glob/fnmatch package.
+
+glob.tar: glob/ChangeLog glob/COPYING.LIB \
+ glob/Makefile.in glob/configure glob/configure.in glob/configure.bat\
+ glob/fnmatch.h glob/glob.h glob/fnmatch.c glob/glob.c
+ tar cho$(verbose)f $@ $^
+glob/%.c: %.c
+ rm -f $@
+ ln -s ../$< $@
+glob/%.h: %.h
+ rm -f $@
+ ln -s ../$< $@
+
+glob/configure: glob/configure.in
+ cd glob; autoconf $(ACFLAGS)
+
+glob/ChangeLog: ../ChangeLog
+ changelog-extract --regexp 'posix/(glob|fnmatch).*' < $< > $@.new
+ chmod a-w $@.new
+ mv -f $@.new $@
+
+%.Z: %
+ compress -c $< > $@-tmp
+ mv $@-tmp $@
+%.gz: %
+ gzip -9v -c $< > $@-tmp
+ mv $@-tmp $@
diff --git a/posix/confstr.c b/posix/confstr.c
new file mode 100644
index 0000000000..5b4a7bea93
--- /dev/null
+++ b/posix/confstr.c
@@ -0,0 +1,54 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <stddef.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+#include <confstr.h>
+
+/* If BUF is not NULL, fill in at most LEN characters of BUF
+ with the value corresponding to NAME. Return the number
+ of characters required to hold NAME's entire value. */
+size_t
+DEFUN(confstr, (name, buf, len),
+ int name AND char *buf AND size_t len)
+{
+ CONST char *string;
+ size_t string_len;
+
+ switch (name)
+ {
+ case _CS_PATH:
+ {
+ static CONST char cs_path[] = CS_PATH;
+ string = cs_path;
+ string_len = sizeof(cs_path);
+ }
+ break;
+
+ default:
+ errno = EINVAL;
+ return 0;
+ }
+
+ if (buf != NULL)
+ (void) strncpy(buf, string, len);
+ return string_len;
+}
diff --git a/posix/execl.c b/posix/execl.c
new file mode 100644
index 0000000000..9aa13b958f
--- /dev/null
+++ b/posix/execl.c
@@ -0,0 +1,48 @@
+/* Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <stddef.h>
+
+#ifndef HAVE_GNU_LD
+#define __environ environ
+#endif
+
+/* Execute PATH with all arguments after PATH until
+ a NULL pointer and environment from `environ'. */
+int
+DEFUN(execl, (path, arg), CONST char *path AND CONST char *arg DOTS)
+{
+ CONST char *argv[1024];
+ register unsigned int i;
+ va_list args;
+
+ argv[0] = arg;
+
+ va_start (args, arg);
+ i = 1;
+ do
+ {
+ argv[i] = va_arg (args, CONST char *);
+ } while (argv[i++] != NULL);
+ va_end (args);
+
+ return __execve (path, (char *CONST *) argv, __environ);
+}
diff --git a/posix/execle.c b/posix/execle.c
new file mode 100644
index 0000000000..a36d49a407
--- /dev/null
+++ b/posix/execle.c
@@ -0,0 +1,45 @@
+/* Copyright (C) 1991 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <stddef.h>
+
+/* Execute PATH with all arguments after PATH until a NULL pointer,
+ and the argument after that for environment. */
+int
+DEFUN(execle, (path), CONST char *path AND CONST char *arg DOTS)
+{
+ CONST char *argv[1024], *CONST *envp;
+ register unsigned int i;
+ va_list args;
+
+ va_start(args, arg);
+ argv[0] = arg;
+ i = 1;
+ do
+ {
+ argv[i] = va_arg(args, CONST char *);
+ } while (argv[i++] != NULL);
+
+ envp = va_arg(args, CONST char *CONST *);
+ va_end(args);
+
+ return __execve(path, (char *CONST *) argv, (char *CONST *) envp);
+}
diff --git a/posix/execlp.c b/posix/execlp.c
new file mode 100644
index 0000000000..af09dacafd
--- /dev/null
+++ b/posix/execlp.c
@@ -0,0 +1,44 @@
+/* Copyright (C) 1991, 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <stddef.h>
+
+/* Execute FILE, searching in the `PATH' environment variable if
+ it contains no slashes, with all arguments after FILE until a
+ NULL pointer and environment from `environ'. */
+int
+DEFUN(execlp, (file), CONST char *file DOTS)
+{
+ CONST char *argv[1024];
+ register unsigned int i;
+ va_list args;
+
+ va_start (args, file);
+
+ i = 0;
+ do
+ argv[i] = va_arg (args, CONST char *);
+ while (argv[i++] != NULL);
+
+ va_end (args);
+
+ return execvp (file, (char *CONST *) argv);
+}
diff --git a/posix/execv.c b/posix/execv.c
new file mode 100644
index 0000000000..1749e24631
--- /dev/null
+++ b/posix/execv.c
@@ -0,0 +1,31 @@
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <unistd.h>
+
+#ifndef HAVE_GNU_LD
+#define __environ environ
+#endif
+
+/* Execute PATH with arguments ARGV and environment from `environ'. */
+int
+DEFUN(execv, (path, argv), CONST char *path AND char *CONST argv[])
+{
+ return __execve(path, argv, __environ);
+}
diff --git a/posix/execvp.c b/posix/execvp.c
new file mode 100644
index 0000000000..01ae0d10a9
--- /dev/null
+++ b/posix/execvp.c
@@ -0,0 +1,112 @@
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Library General Public License as
+published by the Free Software Foundation; either version 2 of the
+License, or (at your option) any later version.
+
+The GNU C Library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Library General Public License for more details.
+
+You should have received a copy of the GNU Library General Public
+License along with the GNU C Library; see the file COPYING.LIB. If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA. */
+
+#include <ansidecl.h>
+#include <unistd.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <limits.h>
+#include <sys/types.h>
+
+#ifndef HAVE_GNU_LD
+#define __environ environ
+#endif
+
+/* Execute FILE, searching in the `PATH' environment variable if it contains
+ no slashes, with arguments ARGV and environment from `environ'. */
+int
+DEFUN(execvp, (file, argv), CONST char *file AND char *CONST argv[])
+{
+ if (strchr (file, '/') == NULL)
+ {
+ char *path, *p;
+ struct stat st;
+ size_t len;
+ uid_t uid;
+ gid_t gid;
+ int ngroups;
+ gid_t groups[NGROUPS_MAX];
+ char *name;
+
+ path = getenv ("PATH");
+ if (path == NULL)
+ {
+ /* There is no `PATH' in the environment.
+ The default search path is the current directory
+ followed by the path `confstr' returns for `_CS_PATH'. */
+ len = confstr (_CS_PATH, (char *) NULL, 0);
+ path = (char *) __alloca (1 + len);
+ path[0] = ':';
+ (void) confstr (_CS_PATH, path + 1, len);
+ }
+
+ len = strlen (file) + 1;
+ name = __alloca (strlen (path) + len);
+ uid = geteuid ();
+ gid = getegid ();
+ ngroups = getgroups (sizeof (groups) / sizeof (groups[0]), groups);
+ p = path;
+ do
+ {
+ path = p;
+ p = strchr (path, ':');
+ if (p == NULL)
+ p = strchr (path, '\0');
+
+ if (p == path)
+ /* Two adjacent colons, or a colon at the beginning or the end
+ of `PATH' means to search the current directory. */
+ (void) memcpy (name, file, len);
+ else
+ {
+ /* Construct the pathname to try. */
+ (void) memcpy (name, path, p - path);
+ name[p - path] = '/';
+ (void) memcpy (&name[(p - path) + 1], file, len);
+ }
+ if (stat (name, &st) == 0 && S_ISREG (st.st_mode))
+ {
+ int bit = S_IXOTH;
+ if (st.st_uid == uid)
+ bit = S_IXUSR;
+ else if (st.st_gid == gid)
+ bit = S_IXGRP;
+ else
+ {
+ register int i;
+ for (i = 0; i < ngroups; ++i)
+ if (st.st_gid == groups[i])
+ {
+ bit = S_IXGRP;
+ break;
+ }
+ }
+ if (st.st_mode & bit)
+ {
+ file = name;
+ break;
+ }
+ }
+ }
+ while (*p++ != '\0');
+ }
+<