1 /*- 2 * BSD LICENSE 3 * 4 * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of Intel Corporation nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #ifndef _PROCESS_H_ 35 #define _PROCESS_H_ 36 37 #ifdef RTE_EXEC_ENV_BSDAPP 38 #define self "curproc" 39 #define exe "file" 40 #else 41 #define self "self" 42 #define exe "exe" 43 #endif 44 45 /* 46 * launches a second copy of the test process using the given argv parameters, 47 * which should include argv[0] as the process name. To identify in the 48 * subprocess the source of the call, the env_value parameter is set in the 49 * environment as $RTE_TEST 50 */ 51 static inline int 52 process_dup(const char *const argv[], int numargs, const char *env_value) 53 { 54 int num; 55 #ifdef RTE_LIBRTE_XEN_DOM0 56 char *argv_cpy[numargs + 2]; 57 #else 58 char *argv_cpy[numargs + 1]; 59 #endif 60 int i, fd, status; 61 char path[32]; 62 63 pid_t pid = fork(); 64 if (pid < 0) 65 return -1; 66 else if (pid == 0) { 67 /* make a copy of the arguments to be passed to exec */ 68 for (i = 0; i < numargs; i++) 69 argv_cpy[i] = strdup(argv[i]); 70 #ifdef RTE_LIBRTE_XEN_DOM0 71 argv_cpy[i] = strdup("--xen-dom0"); 72 argv_cpy[i + 1] = NULL; 73 num = numargs + 1; 74 #else 75 argv_cpy[i] = NULL; 76 num = numargs; 77 #endif 78 79 /* close all open file descriptors, check /proc/self/fd to only 80 * call close on open fds. Exclude fds 0, 1 and 2*/ 81 for (fd = getdtablesize(); fd > 2; fd-- ) { 82 snprintf(path, sizeof(path), "/proc/" exe "/fd/%d", fd); 83 if (access(path, F_OK) == 0) 84 close(fd); 85 } 86 printf("Running binary with argv[]:"); 87 for (i = 0; i < num; i++) 88 printf("'%s' ", argv_cpy[i]); 89 printf("\n"); 90 91 /* set the environment variable */ 92 if (setenv(RECURSIVE_ENV_VAR, env_value, 1) != 0) 93 rte_panic("Cannot export environment variable\n"); 94 if (execv("/proc/" self "/" exe, argv_cpy) < 0) 95 rte_panic("Cannot exec\n"); 96 } 97 /* parent process does a wait */ 98 while (wait(&status) != pid) 99 ; 100 return status; 101 } 102 103 #endif /* _PROCESS_H_ */ 104