1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2014 Garrett D'Amore <garrett@damore.org> 14 */ 15 16 #include "lint.h" 17 #include <stdio.h> 18 #include <unistd.h> 19 #include <fcntl.h> 20 #include <errno.h> 21 #include <assert.h> 22 23 #define FDFILE "/dev/fd/%u" 24 25 /* 26 * fexecve.c - implements the fexecve function. 27 * 28 * We implement in terms of the execve() system call, but use the path 29 * /dev/fd/<fd>. This depends on special handling in the execve system 30 * call; note that /dev/fd files are not normally directly executable. 31 * This does not actually use the fd filesystem mounted on /dev/fd. 32 */ 33 int 34 fexecve(int fd, char *const argv[], char *const envp[]) 35 { 36 char path[32]; /* 8 for "/dev/fd/", 10 for %u, + \0 == 19 */ 37 38 if (fcntl(fd, F_GETFL) < 0) { 39 /* This will have the effect of returning EBADF */ 40 return (-1); 41 } 42 assert(snprintf(NULL, 0, FDFILE, fd) < (sizeof (path) - 1)); 43 (void) snprintf(path, sizeof (path), FDFILE, fd); 44 return (execve(path, argv, envp)); 45 }