static void find_wrapper_target(struct wrapper_data *data) { FILE *inpipe = NULL; char str[MAXPATHLEN + 1]; if (find_target_in_path(data)) return; if (find_target_in_envd(data, 0)) return; /* Only our wrapper is in PATH, so get the CC path using gcc-config and execute the real binary in there... */ inpipe = popen(GCC_CONFIG " --get-bin-path", "r"); if (inpipe == NULL) wrapper_exit( "Could not open pipe: %s\n", wrapper_strerror(errno, data)); if (fgets(str, MAXPATHLEN, inpipe) == 0) wrapper_exit( "Could not get compiler binary path: %s\n", wrapper_strerror(errno, data)); strncpy(data->bin, str, sizeof(data->bin) - 1); data->bin[strlen(data->bin) - 1] = '/'; strncat(data->bin, data->name, sizeof(data->bin) - 1); data->bin[MAXPATHLEN] = 0; pclose(inpipe); }
static void find_wrapper_target(struct wrapper_data *data) { if (find_target_in_path(data)) return; if (find_target_in_envd(data, 0)) return; /* Only our wrapper is in PATH, so get the CC path using * gcc-config and execute the real binary in there ... */ FILE *inpipe = popen(GCC_CONFIG " --get-bin-path", "r"); if (inpipe == NULL) wrapper_errp("could not open pipe"); char str[PATH_MAX + 1]; if (fgets(str, PATH_MAX, inpipe) == 0) wrapper_errp("could not get compiler binary path"); /* chomp! */ size_t plen = strlen(str); if (str[plen-1] == '\n') str[plen-1] = '\0'; data->bin = xmalloc(plen + 1 + strlen(data->name) + 1); sprintf(data->bin, "%s/%s", str, data->name); pclose(inpipe); }
/* find_target_in_envd parses /etc/env.d/05gcc, and tries to * extract PATH, which is set to the current profile's bin * directory ... */ static int find_target_in_envd(struct wrapper_data *data, int cross_compile) { FILE *envfile = NULL; char *token = NULL, *state; char str[MAXPATHLEN + 1]; char *strp = str; char envd_file[MAXPATHLEN + 1]; if (!cross_compile) { snprintf(envd_file, MAXPATHLEN, "%s", ENVD_BASE); } else { char *ctarget, *end = strrchr(data->name, '-'); if (end == NULL) return 0; ctarget = strdup(data->name); ctarget[end - data->name] = '\0'; snprintf(envd_file, MAXPATHLEN, "%s-%s", ENVD_BASE, ctarget); free(ctarget); } envfile = fopen(envd_file, "r"); if (envfile == NULL) return 0; while (0 != fgets(strp, MAXPATHLEN, envfile)) { /* Keep reading ENVD_FILE until we get a line that * starts with 'PATH=' */ if (((strp) && (strlen(strp) > strlen("PATH=")) && !strncmp("PATH=", strp, strlen("PATH=")))) { token = strtok_r(strp, "=", &state); if ((token != NULL) && strlen(token)) /* The second token should be the value of PATH .. */ token = strtok_r(NULL, "=", &state); else goto bail; if ((token != NULL) && strlen(token)) { strp = token; /* A bash variable may be unquoted, quoted with " or * quoted with ', so extract the value without those .. */ token = strtok(strp, "\n\"\'"); while (token != NULL) { if (check_for_target(token, data)) { fclose(envfile); return 1; } token = strtok(NULL, "\n\"\'"); } } } strp = str; } bail: fclose(envfile); return (cross_compile ? 0 : find_target_in_envd(data, 1)); }
/* find_target_in_envd parses /etc/env.d/05gcc, and tries to * extract PATH, which is set to the current profile's bin * directory ... */ static int find_target_in_envd(struct wrapper_data *data, int cross_compile) { FILE *envfile = NULL; char *token = NULL, *state; char str[MAXPATHLEN + 1]; char *strp = str; char envd_file[MAXPATHLEN + 1]; if (!cross_compile) { /* for the sake of speed, we'll keep a symlink around for * the native compiler. #190260 */ snprintf(envd_file, sizeof(envd_file)-1, "/etc/env.d/gcc/.NATIVE"); } else { char *ctarget, *end = strrchr(data->name, '-'); if (end == NULL) return 0; ctarget = strdup(data->name); ctarget[end - data->name] = '\0'; snprintf(envd_file, MAXPATHLEN, "%s-%s", ENVD_BASE, ctarget); free(ctarget); } envfile = fopen(envd_file, "r"); if (envfile == NULL) return 0; while (fgets(strp, MAXPATHLEN, envfile) != NULL) { /* Keep reading ENVD_FILE until we get a line that * starts with 'GCC_PATH=' ... keep 'PATH=' around * for older gcc versions. */ if (strncmp(strp, "GCC_PATH=", strlen("GCC_PATH=")) && strncmp(strp, "PATH=", strlen("PATH="))) continue; token = strtok_r(strp, "=", &state); if ((token != NULL) && strlen(token)) /* The second token should be the value of PATH .. */ token = strtok_r(NULL, "=", &state); else goto bail; if ((token != NULL) && strlen(token)) { strp = token; /* A bash variable may be unquoted, quoted with " or * quoted with ', so extract the value without those .. */ token = strtok(strp, "\n\"\'"); while (token != NULL) { if (check_for_target(token, data)) { fclose(envfile); return 1; } token = strtok(NULL, "\n\"\'"); } } strp = str; } bail: fclose(envfile); return (cross_compile ? 0 : find_target_in_envd(data, 1)); }