21 #define PSCMD "/bin/ps" 25 #define TAILCMD "/usr/bin/tail" 53 char symlink[NAME_MAX], real_exe[NAME_MAX];
54 snprintf(symlink, NAME_MAX,
"/proc/%d/exe", getpid());
55 if ((len = readlink(symlink, real_exe, NAME_MAX)) > 0) {
57 strncpy(
a_out, real_exe, len);
62 if (!
a_out && (access(PSCMD,X_OK) == 0)) {
63 char cmd[
sizeof(PSCMD) +
sizeof(TAILCMD) + 100];
66 sprintf(cmd,
"%s -p%d | %s -1 | awk '{print $NF}'", PSCMD, (
int)pid, TAILCMD);
70 if (fscanf(fp,
"%s",c) == 1) {
74 char *path = getenv(
"PATH");
77 char *saved = strdup(path);
79 char *token = strtok(saved,
":");
81 int lenf = strlen(start) + 1 + lenc + 1;
82 char *fullpath = malloc(lenf *
sizeof(*fullpath));
83 snprintf(fullpath,lenf,
"%s/%s",start,c);
84 if (access(fullpath,X_OK) == 0) {
90 token = strtok(NULL,
":");
100 if (!
a_out)
a_out = strdup(
"/unknown/executable");
110 args = calloc(argc,
sizeof(arg_t));
113 char *env = getenv(
"MPL_CL_TERMINATE");
117 for (j=0; j<argc; j++) {
118 if (!argv[j] || strcmp(argv[j],
cl_terminate) == 0)
break;
119 args[j].name = strdup(argv[j]);
120 args[j].len = strlen(argv[j]);
125 args[0].name = strdup(arg0);
126 args[0].len = strlen(arg0);
140 const char *arg = NULL;
141 if (argno == 0 && !
args) {
145 arg =
args[argno].name;
159 argv = calloc((argc + 1),
sizeof(*argv));
160 for (j=0; j<argc; j++) {
178 int Argno = argno ? *argno : -1;
179 if (arg && arg_len > 0 &&
181 const char *s =
args[Argno].name;
182 int len =
args[Argno].len;
183 if (arg_len < len) len = arg_len;
185 if (arg_len > len) memset(&arg[len],
' ',arg_len-len);
202 int Argno = argno ? *argno : -1;
203 if (arg && arg_len >= 0 &&
205 char *s = calloc(arg_len+1,
sizeof(*s));
206 strncpy(s,arg,arg_len);
209 args[Argno].name = s;
210 args[Argno].len = arg_len;
227 int Argc = argc ? *argc : 0;
228 if (cterm && cterm_len >= 0) {
246 if (Argc < 0) Argc = 0;
const char * ec_GetArgs(int argno)
void getarg_c_(const int *argno, char *arg, const int arg_len)
void putarg_c(const int *argno, const char *arg, int arg_len)
void ec_PutArgs(int argc, char *argv[])
void getarg_c(const int *argno, char *arg, const int arg_len)
quick &counting sorts only inumt inumt name
void putarg_c_(const int *argno, const char *arg, int arg_len)
void putarg_info_(const int *argc, const char *cterm, int cterm_len)
void putarg_info(const int *argc, const char *cterm, int cterm_len)
int snprintf(char *str, size_t size, const char *format,...)
static char * cl_terminate
static const char * get_a_out()