// // File: getConfigFilename.cpp // // Author: fatray // // Created on 05 December 2007, 23:39 // // FIXME: portability // I hacked include on to silence my compiler, is it valid? #include #include #include #include "getConfigFilename.h" #include #include #include #ifdef WIN32 #include #include #endif // get the full pathname of a configfile std::string getConfigFilename() { char num[512]; FILE *in; FILE *out; char* home; // FIXME: fixed length buffers are not ideal. char projectM_home[1024]; char projectM_config[1024]; strcpy(projectM_config, PROJECTM_PREFIX); strcpy(projectM_config + strlen(PROJECTM_PREFIX), CONFIG_FILE); projectM_config[strlen(PROJECTM_PREFIX) + strlen(CONFIG_FILE)] = '\0'; printf("dir:%s \n", projectM_config); home = getenv("HOME"); strcpy(projectM_home, home); strcpy(projectM_home + strlen(home), "/.projectM/config.inp"); projectM_home[strlen(home) + strlen("/.projectM/config.inp")] = '\0'; if ((in = fopen(projectM_home, "r"))) { printf("reading ~/.projectM/config.inp \n"); fclose(in); return std::string(projectM_home); } printf("trying to create ~/.projectM/config.inp \n"); projectM_home[strlen(home) + strlen("/.projectM")] = '\0'; #ifdef WIN32 CreateDirectory(home, NULL); #else mkdir(projectM_home, 0755); #endif strcpy(projectM_home + strlen(home), "/.projectM/config.inp"); projectM_home[strlen(home) + strlen("/.projectM/config.inp")] = '\0'; if((out = fopen(projectM_home, "w"))) { if ((in = fopen(projectM_config, "r"))) { while(fgets(num, 80, in)!=NULL) { fputs(num, out); } fclose(in); fclose(out); if ((in = fopen(projectM_home, "r"))) { printf("created ~/.projectM/config.inp successfully\n"); fclose(in); return std::string(projectM_home); } printf("This shouldn't happen, using implementation defaults\n"); abort(); } printf("Cannot find projectM default config, using implementation defaults\n"); abort(); } printf("Cannot create ~/.projectM/config.inp, using default config file\n"); if ((in = fopen(projectM_config, "r"))) { printf("Successfully opened default config file\n"); fclose(in); return std::string(projectM_config); } printf("Using implementation defaults, your system is really messed up, I'm surprised we even got this far\n"); abort(); }