int player_create(char *name, char *password) { if ( char_eq(name, "admin") || char_eq(name, "root") || strlen(name) >= 16 ) { return 1; } for ( int i = 0; name[i]; i++ ) { char c = name[i]; if ( !RANGE(c, 'a', 'z') && !RANGE(c, 'A', 'Z') && !RANGE(c, '0', '9') && c != '_' && c != '-' && c != '.' ) { return 1; } } player_database_t *new_player = &player_database[player_database_n]; strcpy(new_player->name, name); memcpy(new_player->password_hash, password, sizeof(char) * 16); // fill up properties double r = 100 + 400 * (double)rand() / RAND_MAX; double fi = 2 * 3.14159265359 * (double) rand() / RAND_MAX; new_player->x = (int)( r * cos(fi) ); new_player->y = (int)( r * sin(fi) ); new_player->hp = 100; new_player->movement_speed = 1; player_database_n++; return database_backup(); }
int database_save (struct database *wdb) { /* This function returns 1 on success and 0 on failure */ /* It logs failure and maybe it should leave that task to the calling function */ /* README : this function reads from the database memory without locking */ struct database_hdr hdr; char *basedir; char dir[BUFFERLEN]; char filename[BUFFERLEN]; int fd; uint32_t c; // FIXME: this all filename guessing should be inside a function if ((basedir = getenv ("DRQUEUE_DB")) == NULL) { /* This should never happen because we check it at the beginning of the program */ log_auto (L_ERROR,"database_save() : DRQUEUE_DB environment variable could not be found. Master db cannot be saved."); drerrno = DRE_NOENVROOT; return 0; } snprintf (dir, BUFFERLEN - 1, "%s", basedir); snprintf (filename, BUFFERLEN - 1, "%s/drqueue.db", dir); // Lock it semaphore_lock(wdb->semid); if (database_backup(wdb) == 0) { // FIXME: filename should be a value returned by a function log_auto (L_ERROR,"database_save() : there was an error while backing up old database. NOT SAVING current one. (file: %s)", filename); } // FIXME: // dbfd = database_file_open(filename) log_auto (L_INFO,"Storing DB into: '%s'",filename); if ((fd = open (filename, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1) { if (errno == ENOENT) { /* If its because the directory does not exist we try creating it first */ #ifdef _WIN32 if (mkdir (dir) == -1) { #else if (mkdir (dir, 0775) == -1) { #endif drerrno_system = errno; log_auto (L_WARNING,"Could not create database directory. Check permissions: %s. (%s)", dir,strerror(drerrno_system)); drerrno = DRE_COULDNOTCREATE; return 0; } if ((fd = open (filename, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1) { log_auto (L_WARNING,"Could not open database file for writing. Check permissions: %s. (%s)", filename,strerror(drerrno_system)); drerrno = DRE_COULDNOTCREATE; return 0; } } else { /* could not open the file for other reasons */ log_auto (L_WARNING,"Could not open database file for writing. Check permissions: %s", filename); drerrno = DRE_COULDNOTCREATE; return 0; } } // FIXME: database_header_save() hdr.magic = DB_MAGIC; hdr.version = database_version_id(); hdr.job_size = MAXJOBS; write_32b (fd, &hdr.magic); write_32b (fd, &hdr.version); write_16b (fd, &hdr.job_size); for (c = 0; c < hdr.job_size; c++) { logger_job = &wdb->job[c]; if (!database_job_save (fd, &wdb->job[c])) { // FIXME: report log_auto (L_ERROR,"database_save(): error saving job number %i. (%s)",c,strerror(drerrno_system)); return 0; } } logger_job = NULL; log_auto (L_INFO,"Database saved successfully."); semaphore_release(wdb->semid); // Unlock it return 1; } int database_job_save_frames (int sfd, struct job *job) { int nframes = job_nframes (job); struct frame_info *fi; int i; if ((fi = attach_frame_shared_memory (job->fishmid)) == (void *) -1) { // Store empty frames in an attemp to save other jobs // FIXME: Warning CORRUPT struct frame_info fi2; job_frame_info_init (&fi2); for (i = 0; i < nframes; i++) { if (!send_frame_info (sfd, &fi2)) { return 0; } } } else { for (i = 0; i < nframes; i++) { if (!send_frame_info (sfd, &fi[i])) { detach_frame_shared_memory (fi); return 0; } } detach_frame_shared_memory (fi); } return 1; }