1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* Copyright (c) 1988 AT&T */ 28 /* All Rights Reserved */ 29 30 /* 31 * execl(name, arg0, arg1, ..., argn, 0) 32 * environment automatically passed. 33 */ 34 35 #pragma weak _execl = execl 36 37 #include "lint.h" 38 #include <alloca.h> 39 #include <malloc.h> 40 #include <stdarg.h> 41 #include <sys/types.h> 42 #include <unistd.h> 43 44 /*VARARGS1*/ 45 int 46 execl(const char *name, const char *arg0, ...) 47 { 48 char **argp; 49 va_list args; 50 char **argvec; 51 extern char **_environ; 52 int err; 53 int nargs = 0; 54 char *nextarg; 55 56 /* 57 * count the number of arguments in the variable argument list 58 * and allocate an argument vector for them on the stack, 59 * adding an extra element for a terminating null pointer 60 */ 61 62 va_start(args, arg0); 63 while (va_arg(args, char *) != (char *)0) { 64 nargs++; 65 } 66 va_end(args); 67 68 /* 69 * load the arguments in the variable argument list 70 * into the argument vector and add the terminating null pointer 71 */ 72 73 va_start(args, arg0); 74 75 /* workaround for bugid 1242839 */ 76 argvec = (char **)alloca((size_t)((nargs + 2) * sizeof (char *))); 77 argp = argvec; 78 *argp++ = (char *)arg0; 79 while ((nextarg = va_arg(args, char *)) != (char *)0) { 80 *argp++ = nextarg; 81 } 82 va_end(args); 83 *argp = (char *)0; 84 85 /* 86 * call execve() 87 */ 88 89 err = execve(name, argvec, _environ); 90 return (err); 91 } 92