~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/um/os-Linux/execvp.c

Version: ~ [ linux-5.16 ] ~ [ linux-5.15.13 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.90 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.170 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.224 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.261 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.296 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.298 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* Copyright (C) 2006 by Paolo Giarrusso - modified from glibc' execvp.c.
  2    Original copyright notice follows:
  3 
  4    Copyright (C) 1991,92,1995-99,2002,2004 Free Software Foundation, Inc.
  5    This file is part of the GNU C Library.
  6 
  7    The GNU C Library is free software; you can redistribute it and/or
  8    modify it under the terms of the GNU Lesser General Public
  9    License as published by the Free Software Foundation; either
 10    version 2.1 of the License, or (at your option) any later version.
 11 
 12    The GNU C Library is distributed in the hope that it will be useful,
 13    but WITHOUT ANY WARRANTY; without even the implied warranty of
 14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 15    Lesser General Public License for more details.
 16 
 17    You should have received a copy of the GNU Lesser General Public
 18    License along with the GNU C Library; if not, write to the Free
 19    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
 20    02111-1307 USA.  */
 21 #include <unistd.h>
 22 
 23 #include <stdbool.h>
 24 #include <stdlib.h>
 25 #include <string.h>
 26 #include <errno.h>
 27 #include <limits.h>
 28 
 29 #ifndef TEST
 30 #include <um_malloc.h>
 31 #else
 32 #include <stdio.h>
 33 #define um_kmalloc malloc
 34 #endif
 35 #include <os.h>
 36 
 37 /* Execute FILE, searching in the `PATH' environment variable if it contains
 38    no slashes, with arguments ARGV and environment from `environ'.  */
 39 int execvp_noalloc(char *buf, const char *file, char *const argv[])
 40 {
 41         if (*file == '\0') {
 42                 return -ENOENT;
 43         }
 44 
 45         if (strchr (file, '/') != NULL) {
 46                 /* Don't search when it contains a slash.  */
 47                 execv(file, argv);
 48         } else {
 49                 int got_eacces;
 50                 size_t len, pathlen;
 51                 char *name, *p;
 52                 char *path = getenv("PATH");
 53                 if (path == NULL)
 54                         path = ":/bin:/usr/bin";
 55 
 56                 len = strlen(file) + 1;
 57                 pathlen = strlen(path);
 58                 /* Copy the file name at the top.  */
 59                 name = memcpy(buf + pathlen + 1, file, len);
 60                 /* And add the slash.  */
 61                 *--name = '/';
 62 
 63                 got_eacces = 0;
 64                 p = path;
 65                 do {
 66                         char *startp;
 67 
 68                         path = p;
 69                         //Let's avoid this GNU extension.
 70                         //p = strchrnul (path, ':');
 71                         p = strchr(path, ':');
 72                         if (!p)
 73                                 p = strchr(path, '\0');
 74 
 75                         if (p == path)
 76                                 /* Two adjacent colons, or a colon at the beginning or the end
 77                                    of `PATH' means to search the current directory.  */
 78                                 startp = name + 1;
 79                         else
 80                                 startp = memcpy(name - (p - path), path, p - path);
 81 
 82                         /* Try to execute this name.  If it works, execv will not return.  */
 83                         execv(startp, argv);
 84 
 85                         /*
 86                         if (errno == ENOEXEC) {
 87                         }
 88                         */
 89 
 90                         switch (errno) {
 91                                 case EACCES:
 92                                         /* Record the we got a `Permission denied' error.  If we end
 93                                            up finding no executable we can use, we want to diagnose
 94                                            that we did find one but were denied access.  */
 95                                         got_eacces = 1;
 96                                 case ENOENT:
 97                                 case ESTALE:
 98                                 case ENOTDIR:
 99                                         /* Those errors indicate the file is missing or not executable
100                                            by us, in which case we want to just try the next path
101                                            directory.  */
102                                 case ENODEV:
103                                 case ETIMEDOUT:
104                                         /* Some strange filesystems like AFS return even
105                                            stranger error numbers.  They cannot reasonably mean
106                                            anything else so ignore those, too.  */
107                                 case ENOEXEC:
108                                         /* We won't go searching for the shell
109                                          * if it is not executable - the Linux
110                                          * kernel already handles this enough,
111                                          * for us. */
112                                         break;
113 
114                                 default:
115                                         /* Some other error means we found an executable file, but
116                                            something went wrong executing it; return the error to our
117                                            caller.  */
118                                         return -errno;
119                         }
120                 } while (*p++ != '\0');
121 
122                 /* We tried every element and none of them worked.  */
123                 if (got_eacces)
124                         /* At least one failure was due to permissions, so report that
125                            error.  */
126                         return -EACCES;
127         }
128 
129         /* Return the error from the last attempt (probably ENOENT).  */
130         return -errno;
131 }
132 #ifdef TEST
133 int main(int argc, char**argv)
134 {
135         char buf[PATH_MAX];
136         int ret;
137         argc--;
138         if (!argc) {
139                 os_warn("Not enough arguments\n");
140                 return 1;
141         }
142         argv++;
143         if (ret = execvp_noalloc(buf, argv[0], argv)) {
144                 errno = -ret;
145                 perror("execvp_noalloc");
146         }
147         return 0;
148 }
149 #endif
150 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp