bool OS::expand_user_name(const char* in, const char* slash, char*& dirName) { // expands user name after tilde at in, up to slash // put result in dirName // return false on error char user[logname_max+1]; if (slash - (in + 1) >= sizeof(user)) { static char err[max_path_length + 50]; static char buf[max_path_length + 50]; lsprintf_string(buf, slash - (in + 1), in + 1); sprintf(err, "'%s' exceeds %ld in length", buf, long(sizeof(user) - 1)); dirName = err; return false; } strncpy(user, in + 1, slash - (in + 1)); user[slash - (in + 1)] = '\0'; dirName = get_user_directory(user); if (dirName == NULL) { static char err[max_path_length + 50]; sprintf(err, "unable to find a home directory for user: %s\n", user); dirName = err; return false; } return true; }
/** * Function to initialize the user directories of a user. */ int initialize_user(const char *user) { char **local_dir = get_values(TT_SYS_DIR_KEY); if (local_dir == NULL) { fprintf(LOGFILE, "%s is not configured.\n", TT_SYS_DIR_KEY); return INVALID_TT_ROOT; } char *user_dir; char **local_dir_ptr = local_dir; int failed = 0; for(local_dir_ptr = local_dir; *local_dir_ptr != 0; ++local_dir_ptr) { user_dir = get_user_directory(*local_dir_ptr, user); if (user_dir == NULL) { fprintf(LOGFILE, "Couldn't get userdir directory for %s.\n", user); failed = 1; break; } if (create_directory_for_user(user_dir) != 0) { failed = 1; } free(user_dir); } free_values(local_dir); return failed ? INITIALIZE_USER_FAILED : 0; }
/** * Function to initialize the user directories of a user. */ int initialize_user(const char *user, const char * good_local_dirs) { char **local_dir = get_mapred_local_dirs(good_local_dirs); if (local_dir == NULL) { fprintf(LOGFILE, "Good mapred local directories could ot be obtained.\n"); return INVALID_TT_ROOT; } char *user_dir; char **local_dir_ptr = local_dir; int failed = 0; for(local_dir_ptr = local_dir; *local_dir_ptr != 0; ++local_dir_ptr) { user_dir = get_user_directory(*local_dir_ptr, user); if (user_dir == NULL) { fprintf(LOGFILE, "Couldn't get userdir directory for %s.\n", user); failed = 1; break; } if (create_directory_for_user(user_dir) != 0) { failed = 1; } free(user_dir); } free_values(local_dir); return failed ? INITIALIZE_USER_FAILED : 0; }
/* * Get a user subdirectory. */ char *get_user_subdirectory(const char *tt_root, const char *user, const char *subdir) { char * user_dir = get_user_directory(tt_root, user); char * result = concatenate("%s/%s", "user subdir", 2, user_dir, subdir); free(user_dir); return result; }
void test_get_user_directory() { char *user_dir = get_user_directory("/tmp", "user"); char *expected = "/tmp/usercache/user"; if (strcmp(user_dir, expected) != 0) { printf("test_get_user_directory expected %s got %s\n", expected, user_dir); exit(1); } free(user_dir); }
void save_json( cJSON *root, const char *filename ) { FILE *f = dir_fopen_warn(get_user_directory(), filename, "w+"); if (f == NULL) return; char *buffer = cJSON_Print(root); if (buffer != NULL) { fputs(buffer, f); free(buffer); } fclose(f); }
std::string system_functions::get_temp_directory() { // get .shrimp directory std::string shrimp = get_user_directory(); // check for temp directory std::string temp = shrimp + "/temp"; if (!fltk::filename_isdir(temp.c_str())) { #if defined _WIN32 mkdir(temp.c_str()); #else mkdir(temp.c_str(), 0777); #endif } return temp; }
/** * Function to initialize the user directories of a user. */ int initialize_user(const char *user, char* const* local_dirs) { char *user_dir; char* const* local_dir_ptr; int failed = 0; for(local_dir_ptr = local_dirs; *local_dir_ptr != 0; ++local_dir_ptr) { user_dir = get_user_directory(*local_dir_ptr, user); if (user_dir == NULL) { fprintf(LOGFILE, "Couldn't get userdir directory for %s.\n", user); failed = 1; break; } if (create_directory_for_user(user_dir) != 0) { failed = 1; } free(user_dir); } return failed ? INITIALIZE_USER_FAILED : 0; }
cJSON *load_json( const char *filename ) { FILE *f = dir_fopen_warn(get_user_directory(), filename, "rb"); if (f == NULL) return NULL; size_t buffer_len = ftell_eof(f); char *buffer = malloc(buffer_len + 1); fread(buffer, 1, buffer_len, f); buffer[buffer_len] = '\0'; fclose(f); cJSON *root = cJSON_Parse(buffer); free(buffer); return root; }
void JE_saveConfiguration( void ) { #ifdef TARGET_UNIX if (getenv("HOME")) { char dir[1000]; snprintf(dir, sizeof(dir), "%s/.opentyrian", getenv("HOME")); mkdir(dir, 0755); } #endif /* HOME */ FILE *f; JE_byte *p; int z; p = saveTemp; for (z = 0; z < SAVE_FILES_NUM; z++) { JE_SaveFileType tempSaveFile; memcpy(&tempSaveFile, &saveFiles[z], sizeof(tempSaveFile)); tempSaveFile.encode = SDL_SwapLE16(tempSaveFile.encode); memcpy(p, &tempSaveFile.encode, sizeof(JE_word)); p += 2; tempSaveFile.level = SDL_SwapLE16(tempSaveFile.level); memcpy(p, &tempSaveFile.level, sizeof(JE_word)); p += 2; memcpy(p, &tempSaveFile.items, sizeof(JE_PItemsType)); p += sizeof(JE_PItemsType); tempSaveFile.score = SDL_SwapLE32(tempSaveFile.score); memcpy(p, &tempSaveFile.score, sizeof(JE_longint)); p += 4; tempSaveFile.score2 = SDL_SwapLE32(tempSaveFile.score2); memcpy(p, &tempSaveFile.score2, sizeof(JE_longint)); p += 4; /* SYN: Pascal strings are prefixed by a byte holding the length! */ memset(p, 0, sizeof(tempSaveFile.levelName)); *p = strlen(tempSaveFile.levelName); memcpy(&p[1], &tempSaveFile.levelName, *p); p += 10; /* This was a BYTE array, not a STRING, in the original. Go fig. */ memcpy(p, &tempSaveFile.name, 14); p += 14; memcpy(p, &tempSaveFile.cubes, sizeof(JE_byte)); p++; memcpy(p, &tempSaveFile.power, sizeof(JE_byte) * 2); p += 2; memcpy(p, &tempSaveFile.episode, sizeof(JE_byte)); p++; memcpy(p, &tempSaveFile.lastItems, sizeof(JE_PItemsType)); p += sizeof(JE_PItemsType); memcpy(p, &tempSaveFile.difficulty, sizeof(JE_byte)); p++; memcpy(p, &tempSaveFile.secretHint, sizeof(JE_byte)); p++; memcpy(p, &tempSaveFile.input1, sizeof(JE_byte)); p++; memcpy(p, &tempSaveFile.input2, sizeof(JE_byte)); p++; /* booleans were 1 byte in pascal -- working around it */ Uint8 temp = tempSaveFile.gameHasRepeated != false; memcpy(p, &temp, 1); p++; memcpy(p, &tempSaveFile.initialDifficulty, sizeof(JE_byte)); p++; tempSaveFile.highScore1 = SDL_SwapLE32(tempSaveFile.highScore1); memcpy(p, &tempSaveFile.highScore1, sizeof(JE_longint)); p += 4; tempSaveFile.highScore2 = SDL_SwapLE32(tempSaveFile.highScore2); memcpy(p, &tempSaveFile.highScore2, sizeof(JE_longint)); p += 4; memset(p, 0, sizeof(tempSaveFile.highScoreName)); *p = strlen(tempSaveFile.highScoreName); memcpy(&p[1], &tempSaveFile.highScoreName, *p); p += 30; memcpy(p, &tempSaveFile.highScoreDiff, sizeof(JE_byte)); p++; } saveTemp[SIZEOF_SAVEGAMETEMP - 6] = editorLevel >> 8; saveTemp[SIZEOF_SAVEGAMETEMP - 5] = editorLevel; JE_encryptSaveTemp(); f = dir_fopen_warn(get_user_directory(), "tyrian.sav", "wb"); if (f) { efwrite(saveTemp, 1, sizeof(saveTemp), f); fclose(f); #if (_BSD_SOURCE || _XOPEN_SOURCE >= 500) sync(); #endif } JE_decryptSaveTemp(); f = dir_fopen_warn(get_user_directory(), "tyrian.cfg", "wb"); if (f) { efwrite(&background2, 1, 1, f); efwrite(&gameSpeed, 1, 1, f); efwrite(&inputDevice_, 1, 1, f); efwrite(&jConfigure, 1, 1, f); efwrite(&versionNum, 1, 1, f); efwrite(&processorType, 1, 1, f); efwrite(&midiPort, 1, 1, f); efwrite(&soundEffects, 1, 1, f); efwrite(&gammaCorrection, 1, 1, f); efwrite(&difficultyLevel, 1, 1, f); efwrite(joyButtonAssign, 1, 4, f); efwrite(&tyrMusicVolume, 2, 1, f); efwrite(&fxVolume, 2, 1, f); efwrite(inputDevice, 1, 2, f); efwrite(keySettings, sizeof(*keySettings), COUNTOF(keySettings), f); fclose(f); } save_opentyrian_config(); #if (_BSD_SOURCE || _XOPEN_SOURCE >= 500) sync(); #endif }
void JE_loadConfiguration( void ) { FILE *fi; int z; JE_byte *p; int y; fi = dir_fopen_warn(get_user_directory(), "tyrian.cfg", "rb"); if (fi && ftell_eof(fi) == 20 + sizeof(keySettings)) { /* SYN: I've hardcoded the sizes here because the .CFG file format is fixed anyways, so it's not like they'll change. */ background2 = 0; efread(&background2, 1, 1, fi); efread(&gameSpeed, 1, 1, fi); efread(&inputDevice_, 1, 1, fi); efread(&jConfigure, 1, 1, fi); efread(&versionNum, 1, 1, fi); efread(&processorType, 1, 1, fi); efread(&midiPort, 1, 1, fi); efread(&soundEffects, 1, 1, fi); efread(&gammaCorrection, 1, 1, fi); efread(&difficultyLevel, 1, 1, fi); efread(joyButtonAssign, 1, 4, fi); efread(&tyrMusicVolume, 2, 1, fi); efread(&fxVolume, 2, 1, fi); efread(inputDevice, 1, 2, fi); efread(keySettings, sizeof(*keySettings), COUNTOF(keySettings), fi); fclose(fi); } else { printf("\nInvalid or missing TYRIAN.CFG! Continuing using defaults.\n\n"); soundEffects = 1; memcpy(&keySettings, &defaultKeySettings, sizeof(keySettings)); background2 = true; tyrMusicVolume = fxVolume = 128; gammaCorrection = 0; processorType = 3; gameSpeed = 4; } load_opentyrian_config(); if (tyrMusicVolume > 255) tyrMusicVolume = 255; if (fxVolume > 255) fxVolume = 255; JE_calcFXVol(); set_volume(tyrMusicVolume, fxVolume); fi = dir_fopen_warn(get_user_directory(), "tyrian.sav", "rb"); if (fi) { fseek(fi, 0, SEEK_SET); efread(saveTemp, 1, sizeof(saveTemp), fi); JE_decryptSaveTemp(); /* SYN: The original mostly blasted the save file into raw memory. However, our lives are not so easy, because the C struct is necessarily a different size. So instead we have to loop through each record and load fields manually. *emo tear* :'( */ p = saveTemp; for (z = 0; z < SAVE_FILES_NUM; z++) { memcpy(&saveFiles[z].encode, p, sizeof(JE_word)); p += 2; saveFiles[z].encode = SDL_SwapLE16(saveFiles[z].encode); memcpy(&saveFiles[z].level, p, sizeof(JE_word)); p += 2; saveFiles[z].level = SDL_SwapLE16(saveFiles[z].level); memcpy(&saveFiles[z].items, p, sizeof(JE_PItemsType)); p += sizeof(JE_PItemsType); memcpy(&saveFiles[z].score, p, sizeof(JE_longint)); p += 4; saveFiles[z].score = SDL_SwapLE32(saveFiles[z].score); memcpy(&saveFiles[z].score2, p, sizeof(JE_longint)); p += 4; saveFiles[z].score2 = SDL_SwapLE32(saveFiles[z].score2); /* SYN: Pascal strings are prefixed by a byte holding the length! */ memset(&saveFiles[z].levelName, 0, sizeof(saveFiles[z].levelName)); memcpy(&saveFiles[z].levelName, &p[1], *p); p += 10; /* This was a BYTE array, not a STRING, in the original. Go fig. */ memcpy(&saveFiles[z].name, p, 14); p += 14; memcpy(&saveFiles[z].cubes, p, sizeof(JE_byte)); p++; memcpy(&saveFiles[z].power, p, sizeof(JE_byte) * 2); p += 2; memcpy(&saveFiles[z].episode, p, sizeof(JE_byte)); p++; memcpy(&saveFiles[z].lastItems, p, sizeof(JE_PItemsType)); p += sizeof(JE_PItemsType); memcpy(&saveFiles[z].difficulty, p, sizeof(JE_byte)); p++; memcpy(&saveFiles[z].secretHint, p, sizeof(JE_byte)); p++; memcpy(&saveFiles[z].input1, p, sizeof(JE_byte)); p++; memcpy(&saveFiles[z].input2, p, sizeof(JE_byte)); p++; /* booleans were 1 byte in pascal -- working around it */ Uint8 temp; memcpy(&temp, p, 1); p++; saveFiles[z].gameHasRepeated = temp != 0; memcpy(&saveFiles[z].initialDifficulty, p, sizeof(JE_byte)); p++; memcpy(&saveFiles[z].highScore1, p, sizeof(JE_longint)); p += 4; saveFiles[z].highScore1 = SDL_SwapLE32(saveFiles[z].highScore1); memcpy(&saveFiles[z].highScore2, p, sizeof(JE_longint)); p += 4; saveFiles[z].highScore2 = SDL_SwapLE32(saveFiles[z].highScore2); memset(&saveFiles[z].highScoreName, 0, sizeof(saveFiles[z].highScoreName)); memcpy(&saveFiles[z].highScoreName, &p[1], *p); p += 30; memcpy(&saveFiles[z].highScoreDiff, p, sizeof(JE_byte)); p++; } /* SYN: This is truncating to bytes. I have no idea what this is doing or why. */ /* TODO: Figure out what this is about and make sure it isn't broked. */ editorLevel = (saveTemp[SIZEOF_SAVEGAMETEMP - 5] << 8) | saveTemp[SIZEOF_SAVEGAMETEMP - 6]; fclose(fi); } else { /* We didn't have a save file! Let's make up random stuff! */ editorLevel = 800; for (z = 0; z < 100; z++) { saveTemp[SAVE_FILES_SIZE + z] = initialItemAvail[z]; } for (z = 0; z < SAVE_FILES_NUM; z++) { saveFiles[z].level = 0; for (y = 0; y < 14; y++) { saveFiles[z].name[y] = ' '; } saveFiles[z].name[14] = 0; saveFiles[z].highScore1 = ((mt_rand() % 20) + 1) * 1000; if (z % 6 > 2) { saveFiles[z].highScore2 = ((mt_rand() % 20) + 1) * 1000; strcpy(saveFiles[z].highScoreName, defaultTeamNames[mt_rand() % 22]); } else { strcpy(saveFiles[z].highScoreName, defaultHighScoreNames[mt_rand() % 34]); } } } JE_initProcessorType(); }