diff --git a/cc.c b/cc.c index ac77623..f3178cb 100644 --- a/cc.c +++ b/cc.c @@ -18,6 +18,7 @@ */ #include"cc.h" +#include /* The core functions */ void populate_env(char** envp); @@ -31,7 +32,7 @@ void init_macro_env(char* sym, char* value, char* source, int num); void preprocess(); void output_tokens(struct token_list *i, FILE* out); int strtoint(char *a); -void spawn_processes(int debug_flag, char* preprocessed_file, char* destination, char** envp); +void spawn_processes(int debug_flag, char* prefix, char* preprocessed_file, char* destination, char** envp); void prechecks(int argc, char** argv) { @@ -82,7 +83,7 @@ void prechecks(int argc, char** argv) if(1 <= DEBUG_LEVEL) { fputs("M2LIBC_PATH set by -I to ", stderr); - fputs(M2LIBC_PATH, stderr); + fputs(hold, stderr); fputc('\n', stderr); } M2LIBC_PATH = hold; @@ -140,6 +141,15 @@ int main(int argc, char** argv, char** envp) fputc('\n', stderr); } + TEMPDIR = env_lookup("TMPDIR"); + if(NULL == TEMPDIR) TEMPDIR = "/tmp"; + else if(1 <= DEBUG_LEVEL) + { + fputs("TEMPDIR set by environment variable to ", stderr); + fputs(TEMPDIR, stderr); + fputc('\n', stderr); + } + int i = 1; while(i <= argc) { @@ -245,6 +255,23 @@ int main(int argc, char** argv, char** envp) debug_flag = FALSE; i += 1; } + else if(match(argv[i], "--temp-directory")) + { + name = argv[i+1]; + if(NULL == name) + { + fputs("--temp-directory requires a PATH\n", stderr); + exit(EXIT_FAILURE); + } + if(1 <= DEBUG_LEVEL) + { + fputs("TEMPDIR set by --temp-directory to ", stderr); + fputs(name, stderr); + fputc('\n', stderr); + } + TEMPDIR = name; + i += 2; + } else { fputs("UNKNOWN ARGUMENT\n", stdout); @@ -288,18 +315,19 @@ int main(int argc, char** argv, char** envp) } else { - char* prefix = calloc(10, sizeof(char)); - if(0 == access("/tmp", 0)) + /* Ensure we can write to the temp directory */ + int permissions = access(TEMPDIR, 0); + if(0 != permissions) { - strcpy(prefix, "/tmp/"); - } - else - { - strcpy(prefix, "tmp-"); + fputs("unable to access: ", stderr); + fputs(TEMPDIR, stderr); + fputs(" for use as a temp directory\nPlease use --temp-directory to set a directory you can use or set the TMPDIR variable\n", stderr); + exit(EXIT_FAILURE); } + name = calloc(100, sizeof(char)); - strcpy(name, prefix); - strcat(name, "M2-Mesoplanet-XXXXXX"); + strcpy(name, TEMPDIR); + strcat(name, "/M2-Mesoplanet-XXXXXX"); i = mkstemp(name); tempfile = fdopen(i, "w"); if(NULL != tempfile) @@ -309,7 +337,7 @@ int main(int argc, char** argv, char** envp) fclose(tempfile); /* Make me a real binary */ - spawn_processes(debug_flag, prefix, name, destination_name, envp); + spawn_processes(debug_flag, TEMPDIR, name, destination_name, envp); /* And clean up the donkey */ if(!DIRTY_MODE) remove(name); diff --git a/cc_env.c b/cc_env.c index a00962a..79a5d19 100644 --- a/cc_env.c +++ b/cc_env.c @@ -321,7 +321,7 @@ void populate_env(char** envp) require(4096 > strlen(envp[i]), "envp line exceeds 4096byte limit\n"); strcpy(envp_line, envp[i]); - if(4 <= DEBUG_LEVEL) + if(9 <= DEBUG_LEVEL) { fputs("trying envp_line: ", stderr); fputs(envp_line, stderr); @@ -330,7 +330,7 @@ void populate_env(char** envp) env = process_env_variable(envp_line, env); - if(8 <= DEBUG_LEVEL) + if(9 <= DEBUG_LEVEL) { fputs("got var of: ", stderr); fputs(env->var, stderr); diff --git a/cc_globals.c b/cc_globals.c index a719178..1d01645 100644 --- a/cc_globals.c +++ b/cc_globals.c @@ -44,6 +44,7 @@ int WORDSIZE; int ENDIAN; char* BASEADDRESS; int STDIO_USED; +char* TEMPDIR; /* So we don't shoot ourself in the face */ int FUZZING; diff --git a/cc_globals.h b/cc_globals.h index 0bc6c32..5a1c322 100644 --- a/cc_globals.h +++ b/cc_globals.h @@ -45,6 +45,7 @@ extern int WORDSIZE; extern int ENDIAN; extern char* BASEADDRESS; extern int STDIO_USED; +extern char* TEMPDIR; /* So we don't shoot ourself in the face */ extern int FUZZING; diff --git a/cc_reader.c b/cc_reader.c index 3460b8d..3b6fe07 100644 --- a/cc_reader.c +++ b/cc_reader.c @@ -264,7 +264,6 @@ int get_token(int c) c = consume_byte(c); } - new_token(hold_string, string_index + 2); return c; } @@ -313,8 +312,6 @@ int read_include(int c) } } - /* with just a little extra to put in the matching at the end */ - new_token(hold_string, string_index + 3); return c; } @@ -348,6 +345,9 @@ int include_file(int ch) /* Get new filename */ read_include(ch); + /* with just a little extra to put in the matching at the end */ + new_token(hold_string, string_index + 3); + ch = '\n'; new_filename = token->s; /* Remove name from stream */ @@ -425,6 +425,7 @@ struct token_list* read_all_tokens(FILE* a, struct token_list* current, char* fi while(EOF != ch) { ch = get_token(ch); + new_token(hold_string, string_index + 2); if(match("#include", token->s)) ch = include_file(ch); } diff --git a/cc_spawn.c b/cc_spawn.c index 14e2272..1f7212e 100644 --- a/cc_spawn.c +++ b/cc_spawn.c @@ -421,7 +421,7 @@ void spawn_processes(int debug_flag, char* prefix, char* preprocessed_file, char char* M2_output = calloc(100, sizeof(char)); strcpy(M2_output, prefix); - strcat(M2_output, "M2-Planet-XXXXXX"); + strcat(M2_output, "/M2-Planet-XXXXXX"); int i = mkstemp(M2_output); if(-1 != i) { @@ -439,7 +439,7 @@ void spawn_processes(int debug_flag, char* prefix, char* preprocessed_file, char { blood_output = calloc(100, sizeof(char)); strcpy(blood_output, prefix); - strcat(blood_output, "blood-elf-XXXXXX"); + strcat(blood_output, "/blood-elf-XXXXXX"); i = mkstemp(blood_output); if(-1 != i) { @@ -455,7 +455,7 @@ void spawn_processes(int debug_flag, char* prefix, char* preprocessed_file, char char* M1_output = calloc(100, sizeof(char)); strcpy(M1_output, prefix); - strcat(M1_output, "M1-macro-XXXXXX"); + strcat(M1_output, "/M1-macro-XXXXXX"); i = mkstemp(M1_output); if(-1 != i) {