/* gather some functions common to multiple executables detect_file_args */ #include #include #include #include "debug.h" #include "alloc-inl.h" /* Detect @@ in args. */ #ifndef __glibc__ #include #endif void detect_file_args(char** argv, u8* prog_in) { u32 i = 0; #ifdef __GLIBC__ u8* cwd = getcwd(NULL, 0); /* non portable glibc extension */ #else u8* cwd; char* buf; long size = pathconf(".", _PC_PATH_MAX); if ((buf = (char*)malloc((size_t)size)) != NULL) { cwd = getcwd(buf, (size_t)size); /* portable version */ } else { PFATAL("getcwd() failed"); cwd = 0; /* for dumb compilers */ } #endif if (!cwd) PFATAL("getcwd() failed"); while (argv[i]) { u8* aa_loc = strstr(argv[i], "@@"); if (aa_loc) { u8 *aa_subst, *n_arg; if (!prog_in) FATAL("@@ syntax is not supported by this tool."); /* Be sure that we're always using fully-qualified paths. */ if (prog_in[0] == '/') aa_subst = prog_in; else aa_subst = alloc_printf("%s/%s", cwd, prog_in); /* Construct a replacement argv value. */ *aa_loc = 0; n_arg = alloc_printf("%s%s%s", argv[i], aa_subst, aa_loc + 2); argv[i] = n_arg; *aa_loc = '@'; if (prog_in[0] != '/') ck_free(aa_subst); } i++; } free(cwd); /* not tracked */ }