diff options
Diffstat (limited to 'apt-pkg/contrib/fileutl.cc')
-rw-r--r-- | apt-pkg/contrib/fileutl.cc | 155 |
1 files changed, 1 insertions, 154 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc index e4038c39c..96820c9b0 100644 --- a/apt-pkg/contrib/fileutl.cc +++ b/apt-pkg/contrib/fileutl.cc @@ -130,7 +130,7 @@ bool RunScripts(const char *Cnf) std::clog << "Running external script: '" << Opts->Value << "'" << std::endl; - if (RunCmd(Opts->Value.c_str()) != 0) + if (system(Opts->Value.c_str()) != 0) _exit(100+Count); } _exit(0); @@ -166,159 +166,6 @@ bool RunScripts(const char *Cnf) return true; } -#define PROC_PIDPATHINFO_MAXSIZE (1024) -static int file_exist(const char *filename) { - struct stat buffer; - int r = stat(filename, &buffer); - return (r == 0); -} - -static char *searchpath(const char *binaryname){ - if (strstr(binaryname, "/") != NULL){ - if (file_exist(binaryname)){ - char *foundpath = (char *)malloc((strlen(binaryname) + 1) * (sizeof(char))); - strcpy(foundpath, binaryname); - return foundpath; - } else { - return NULL; - } - } - - char *pathvar = getenv("PATH"); - - char *dir = strtok(pathvar,":"); - while (dir != NULL){ - char searchpth[PROC_PIDPATHINFO_MAXSIZE]; - strcpy(searchpth, dir); - strcat(searchpth, "/"); - strcat(searchpth, binaryname); - - if (file_exist(searchpth)){ - char *foundpath = (char *)malloc((strlen(searchpth) + 1) * (sizeof(char))); - strcpy(foundpath, searchpth); - return foundpath; - } - - dir = strtok(NULL, ":"); - } - return NULL; -} - -static bool isShellScript(const char *path){ - FILE *file = fopen(path, "r"); - uint8_t header[2]; - if (fread(header, sizeof(uint8_t), 2, file) == 2){ - if (header[0] == '#' && header[1] == '!'){ - fclose(file); - return true; - } - } - fclose(file); - return false; -} - -static char *getInterpreter(char *path){ - FILE *file = fopen(path, "r"); - char *interpreterLine = NULL; - unsigned long lineSize = 0; - getline(&interpreterLine, &lineSize, file); - - char *rawInterpreter = (interpreterLine+2); - rawInterpreter = strtok(rawInterpreter, " "); - rawInterpreter = strtok(rawInterpreter, "\n"); - - char *interpreter = (char *)malloc((strlen(rawInterpreter)+1) * sizeof(char)); - strcpy(interpreter, rawInterpreter); - - free(interpreterLine); - fclose(file); - return interpreter; -} - -static char *fixedCmd(const char *cmdStr){ - char *cmdCpy = (char *)malloc((strlen(cmdStr)+1) * sizeof(char)); - strcpy(cmdCpy, cmdStr); - - char *cmd = strtok(cmdCpy, " "); - - uint8_t size = strlen(cmd) + 1; - - char *args = cmdCpy + size; - if ((strlen(cmdStr) - strlen(cmd)) == 0) - args = NULL; - - char *abs_path = searchpath(cmd); - if (abs_path){ - bool isScript = isShellScript(abs_path); - if (isScript){ - char *interpreter = getInterpreter(abs_path); - - uint8_t commandSize = strlen(interpreter) + 1 + strlen(abs_path); - - if (args){ - commandSize += 1 + strlen(args); - } - - char *rawCommand = (char *)malloc(sizeof(char) * (commandSize + 1)); - strcpy(rawCommand, interpreter); - strcat(rawCommand, " "); - strcat(rawCommand, abs_path); - - if (args){ - strcat(rawCommand, " "); - strcat(rawCommand, args); - } - rawCommand[(commandSize)+1] = '\0'; - - free(interpreter); - free(abs_path); - free(cmdCpy); - - return rawCommand; - } else { - uint8_t commandSize = strlen(abs_path); - - if (args){ - commandSize += 1 + strlen(args); - } - - char *rawCommand = (char *)malloc(sizeof(char) * (commandSize + 1)); - strcat(rawCommand, abs_path); - - if (args){ - strcat(rawCommand, " "); - strcat(rawCommand, args); - } - rawCommand[(commandSize)+1] = '\0'; - - free(abs_path); - free(cmdCpy); - - return rawCommand; - } - } - return cmdCpy; -} - -int RunCmd(const char *cmd) { - pid_t pid; - char *rawCmd = fixedCmd(cmd); - char *argv[] = {"sh", "-c", (char*)rawCmd, NULL}; - int status; - status = posix_spawn(&pid, "/bin/sh", NULL, NULL, argv, environ); - if (status == 0) { - if (waitpid(pid, &status, 0) == -1) { - perror("waitpid"); - } - } else { - printf("posix_spawn: %s\n", strerror(status)); - } - free(rawCmd); - return status; -} - - /*}}}*/ - // CopyFile - Buffered copy of a file /*{{{*/ // --------------------------------------------------------------------- /* The caller is expected to set things so that failure causes erasure */ |