예제 #1
0
파일: game.c 프로젝트: lszabi/adventure
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();
}
예제 #2
0
파일: database.c 프로젝트: Hyask/drqueue
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;
}