1/* vi: set sw=4 ts=4: */ 2/* 3 * pidof implementation for busybox 4 * 5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> 6 * 7 * Licensed under the GPL version 2, see the file LICENSE in this tarball. 8 */ 9 10#include "libbb.h" 11 12enum { 13 USE_FEATURE_PIDOF_SINGLE(OPTBIT_SINGLE,) 14 USE_FEATURE_PIDOF_OMIT( OPTBIT_OMIT ,) 15 OPT_SINGLE = USE_FEATURE_PIDOF_SINGLE((1<<OPTBIT_SINGLE)) + 0, 16 OPT_OMIT = USE_FEATURE_PIDOF_OMIT( (1<<OPTBIT_OMIT )) + 0, 17}; 18 19int pidof_main(int argc, char **argv); 20int pidof_main(int argc, char **argv) 21{ 22 unsigned first = 1; 23 unsigned opt; 24#if ENABLE_FEATURE_PIDOF_OMIT 25 char ppid_str[sizeof(int)*3 + 1]; 26 llist_t *omits = NULL; /* list of pids to omit */ 27 opt_complementary = "o::"; 28#endif 29 30 /* do unconditional option parsing */ 31 opt = getopt32(argv, "" 32 USE_FEATURE_PIDOF_SINGLE ("s") 33 USE_FEATURE_PIDOF_OMIT("o:", &omits)); 34 35#if ENABLE_FEATURE_PIDOF_OMIT 36 /* fill omit list. */ 37 { 38 llist_t *omits_p = omits; 39 while (omits_p) { 40 /* are we asked to exclude the parent's process ID? */ 41 if (strcmp(omits_p->data, "%PPID") == 0) { 42 sprintf(ppid_str, "%u", (unsigned)getppid()); 43 omits_p->data = ppid_str; 44 } 45 omits_p = omits_p->link; 46 } 47 } 48#endif 49 /* Looks like everything is set to go. */ 50 while (optind < argc) { 51 pid_t *pidList; 52 pid_t *pl; 53 54 /* reverse the pidlist like GNU pidof does. */ 55 pidList = pidlist_reverse(find_pid_by_name(argv[optind])); 56 for (pl = pidList; *pl; pl++) { 57#if ENABLE_FEATURE_PIDOF_OMIT 58 if (opt & OPT_OMIT) { 59 llist_t *omits_p = omits; 60 while (omits_p) { 61 if (xatoul(omits_p->data) == *pl) { 62 goto omitting; 63 } 64 omits_p = omits_p->link; 65 } 66 } 67#endif 68 printf(" %u" + first, (unsigned)*pl); 69 first = 0; 70 if (ENABLE_FEATURE_PIDOF_SINGLE && (opt & OPT_SINGLE)) 71 break; 72#if ENABLE_FEATURE_PIDOF_OMIT 73 omitting: ; 74#endif 75 } 76 free(pidList); 77 optind++; 78 } 79 putchar('\n'); 80 81#if ENABLE_FEATURE_PIDOF_OMIT 82 if (ENABLE_FEATURE_CLEAN_UP) 83 llist_free(omits, NULL); 84#endif 85 return first; /* 1 (failure) - no processes found */ 86} 87