示例#1
0
文件: skin.c 项目: XQF/xqf
GList *get_q2_skin_list (const char *dir) {
	GList *list = NULL;
	GList *dirs;
	GList *tmp;
	GList *skins;
	GList *skin;
	char *path;
	char *skin_dir;
	char *skin_str;

	path = file_in_dir (dir, "baseq2/players");
	dirs = dir_to_list (path, dir_alldirs_filter);

	for (tmp = dirs; tmp; tmp = tmp->next) {
		skin_dir = file_in_dir (path, (char *) tmp->data);
		skins = dir_to_list (skin_dir, dir_q2_skin_filter);
		g_free (skin_dir);

		for (skin = skins; skin; skin = skin->next) {
			skin_str = file_in_dir ((char *) tmp->data, (char *) skin->data);
			list = g_list_prepend (list, skin_str);
		}
	}

	g_free (path);
	list = g_list_reverse (list);
	return list;
}
示例#2
0
文件: skin.c 项目: XQF/xqf
guchar *get_qw_skin (char *skin, char *path) {
	char *filename;
	char *skinsdir;
	guchar *pcx;
	int skinlen;

	if (!skin || skin[0] == '\0')
		skin = "base.pcx";

	skinsdir = file_in_dir (path, "qw/skins/");
	skinlen = strlen (skin);

	if (skinlen > 4 && g_ascii_strcasecmp (skin + skinlen - 4, ".pcx") == 0)
		filename = file_in_dir (skinsdir, skin);
	else
		filename = skin_filename (skin, skinsdir, ".pcx");

	pcx = read_skin_pcx (filename, FALSE);

#ifdef DEBUG
	if (!pcx)
		fprintf (stderr, "cannot load QW skin %s\n", filename);
#endif

	g_free (filename);
	g_free (skinsdir);
	return pcx;
}
示例#3
0
文件: rc.c 项目: XQF/xqf
int rc_migrate_dir (void) {
	int res;
	struct stat st_buf;
	const gchar* xdg_user_dir = NULL;
	gchar* legacy_user_rcdir = NULL;
	gchar* xdg_user_rcdir = NULL;

	if (!g_get_user_name () || !g_get_home_dir () || !g_get_user_config_dir ()) {
		fprintf(stderr, "Unable to get user name/home directory/XDG config directory\n");
		return FALSE;
	}

	xdg_user_dir = g_get_user_config_dir ();
	legacy_user_rcdir = file_in_dir (g_get_home_dir (), RC_DIR);
	xdg_user_rcdir = file_in_dir (xdg_user_dir, XDG_RC_DIR);

	/* if ~/.qf exists and ~/.config/xqf does not exists */
	if (stat (legacy_user_rcdir, &st_buf) != -1 && stat (xdg_user_rcdir, &st_buf) == -1) {
		/* if ~/.config does not exists, create it */
		if (stat (xdg_user_dir, &st_buf) == -1) {
			res = mkdir (xdg_user_dir, 0755);
			if (res != 0) {
				fprintf(stderr, "Can't create XDG user config directory %s\n", xdg_user_dir);
				g_free(legacy_user_rcdir);
				g_free(xdg_user_rcdir);
				return res;
			}
		}
		else {
			/* move ~/.qf ~/.config/xqf */
			fprintf(stdout, "Moving legacy config directory %s to XDG user config directory %s\n", legacy_user_rcdir, xdg_user_rcdir);
			res = rename(legacy_user_rcdir, xdg_user_rcdir);
			if (res == 0) {
				fprintf(stdout, "Legacy config directory %s succesfully moved to XDG user config directory %s\n", legacy_user_rcdir, xdg_user_rcdir);
			}
			else {
				fprintf(stderr, "Error when moving legacy config directory %s to XDG user config directory %s\n", legacy_user_rcdir, xdg_user_rcdir);
				g_free(legacy_user_rcdir);
				g_free(xdg_user_rcdir);
				return res;
			}
		}
	}
	else if (stat (legacy_user_rcdir, &st_buf) != -1 && stat (xdg_user_rcdir, &st_buf) != -1) {
		fprintf(stderr, "Warning, there is an old legacy config directory %s, but XDG user config directory %s will be used\n", legacy_user_rcdir, xdg_user_rcdir);
	}
	g_free(legacy_user_rcdir);
	g_free(xdg_user_rcdir);
	return TRUE;
}
示例#4
0
static void player_filter_save_patterns (void) {
  GSList *list;
  struct player_pattern *pp;
  FILE *f;
  char *fn;

  fn = file_in_dir (user_rcdir, PLAYERS_FILE);

  if (!players) {
    unlink (fn);
  }
  else {
    f = fopen (fn, "w");
    if (!f) {
      g_free (fn);
      return;
    }

    for (list = players; list; list = list->next) {
      pp = (struct player_pattern *) list->data;

      fprintf (f, "%s {\n  ", mode_symbols[pp->mode]);
      print_dq_string (f, pp->pattern);
      fprintf (f, ",\n  0x%02X,\n  ", pp->groups);
      print_dq_string (f, pp->comment);
      fprintf (f, "\n}\n\n");
    }

    fclose (f);
  }

  g_free (fn);
}
示例#5
0
static void player_filter_load_patterns (void) {
  char *fn;
  int fd;
  GScanner *scanner;
  int retval;
  int i;

  fn = file_in_dir (user_rcdir, PLAYERS_FILE);
  fd = open (fn, O_RDONLY);

  if (fd < 0) {
    g_free (fn);
    return;
  }

  scanner = g_scanner_new (&patterns_scanner_config);

  for (i = TOKEN_STRING; i <= TOKEN_REGEXP; i++) {
    g_scanner_add_symbol (scanner, mode_symbols[i - TOKEN_STRING], 
                                                                GINT_TO_POINTER(i));
  }

  g_scanner_input_file (scanner, fd);

  do {
    retval = player_pattern_parse_statement (scanner, fn);
  } while (retval);

  g_scanner_destroy (scanner);
  g_free (fn);
  close (fd);

  if (filters[FILTER_PLAYER].changed != FILTER_NOT_CHANGED)
    filters[FILTER_PLAYER].last_changed = filter_time_inc();
}
示例#6
0
文件: spawn.c 项目: matyler/mtPaint
static char *new_temp_dir()
{
	char *buf, *base = get_tempdir();

#ifdef HAVE_MKDTEMP
	buf = file_in_dir(NULL, base, "mtpaintXXXXXX", PATHBUF);
	if (!buf) return (NULL);
	if (mkdtemp(buf))
	{
		chmod(buf, 0755);
		return (buf);
	}
#else
	buf = tempnam(base, "mttmp");
	if (!buf) return (NULL);
#ifdef WIN32 /* No mkdtemp() in MinGW */
	/* tempnam() may use Unix path separator */
	reseparate(buf);
	if (!mkdir(buf)) return (buf);
#else
	if (!mkdir(buf, 0755)) return (buf);
#endif
#endif
	free(buf);
	return (NULL);
}
示例#7
0
文件: rc.c 项目: svn2github/xqf
int rc_save (void) {
  char *fn;

  fn = file_in_dir (user_rcdir, RC_FILE);
  unlink (fn);
  g_free (fn);
  return 0;
}
示例#8
0
文件: skin.c 项目: XQF/xqf
GList *get_qw_skin_list (const char *dir) {
	GList *list;
	char *path;

	path = file_in_dir (dir, "qw/skins");
	list = dir_to_list (path, dir_qw_skin_filter);
	g_free (path);

	return list;
}
示例#9
0
文件: config.c 项目: XQF/xqf
static void unlink_file (const char *filename) {
	char *fn;

	fn = file_in_dir (directories->data, filename);
#ifdef DEBUG
	fprintf (stderr, "config.c: unlink_file (%s)\n", fn);
#endif
	unlink (fn);
	g_free (fn);
}
示例#10
0
文件: host.c 项目: svn2github/xqf
void host_cache_load (void) {
  char *hostcache;
  struct zstream z;

  hostcache = file_in_dir (user_rcdir, HOSTCACHE_FILE);
  zstream_open_r (&z, hostcache);

  if (z.f) {
    host_cache_clear ();
    host_cache = host_cache_read_list (z.f);
    zstream_close (&z);
  }

  g_free (hostcache);
}
示例#11
0
文件: skin.c 项目: XQF/xqf
static char *dir_alldirs_filter (const char *dir, const char *str) {
	struct stat st_buf;
	int res;
	char *file;

	if (!str || str[0] == '.')
		return NULL;

	file = file_in_dir (dir, str);
	res = stat (file, &st_buf);
	g_free (file);

	if (res == 0 && S_ISDIR (st_buf.st_mode))
		return g_strdup (str);

	return NULL;
}
示例#12
0
文件: config.c 项目: XQF/xqf
static void load_file (const char *filename) {
	FILE *f = NULL;
	char buf[BUF_SIZE];
	char *fn;
	struct state_s state = {0};
	GSList* l;
	gboolean (*parse_line)(char* buf, struct state_s* state);
	struct config_file* file = NULL;

	debug (4, "%s", filename);

	for (l = directories; l && !f; l = g_slist_next(l)) {
		fn = file_in_dir (l->data, filename);
		f = fopen (fn, "r");
		if (f) debug(4, "loaded %s", fn);
		g_free (fn);
	}

	/* Create empty file record and thus cache lookups of non-existent files.
	 * Don't mark it 'dirty' -- nothing was changed really.
	 */

	find_key (filename, NULL, NULL, TRUE, &file, NULL, NULL);

	if (!f)
		return;

	state.filename = filename;

	// XXX:
	if (!strncmp(filename, "scripts/", strlen("scripts/"))) {
		parse_line = parse_line_script;
		file->read_only = 1;
	}
	else
		parse_line = parse_line_file;

	while (fgets (buf, BUF_SIZE, f))
		parse_line(buf, &state);

	g_free(state.secname);
	fclose (f);
}
示例#13
0
文件: config.c 项目: XQF/xqf
static void dump_file (struct config_file *file) {
	GList *sptr, *kptr;
	struct config_section *section;
	struct config_key *key;
	FILE *f;
	char *fn;

	if (!file->dirty)
		return;

	if (file->read_only)
		return;

	if (!file->sections) {
		unlink_file (file->filename);
		return;
	}

	fn = file_in_dir (directories->data, file->filename);
	f = fopen (fn, "w");
	g_free (fn);

	if (f) {
		for (sptr = file->sections; sptr; sptr = sptr->next) {
			section = (struct config_section *) sptr->data;
			fprintf (f, "[%s]\n", section->name);

			for (kptr = section->keys; kptr; kptr = kptr->next) {
				key = (struct config_key *) kptr->data;
				fprintf (f, "%s=%s\n", key->name, key->value);
			}

			fprintf (f, "\n");
		}
		fclose (f);
	}
}
示例#14
0
文件: skin.c 项目: XQF/xqf
guchar *get_q2_skin (char *skin, char *path) {
	char *skinsdir;
	char *filename;
	guchar *pcx;
	// int skinlen;

	if (!skin || skin[0] == '\0')
		return NULL;

	skinsdir = file_in_dir (path, "baseq2/players/");
	// skinlen = strlen (skin);
	filename = skin_filename (skin, skinsdir, "_i.pcx");

	pcx = read_skin_pcx (filename, TRUE);

#ifdef DEBUG
	if (!pcx)
		fprintf (stderr, "cannot load Q2 skin %s\n", filename);
#endif

	g_free (filename);
	g_free (skinsdir);
	return pcx;
}
示例#15
0
文件: host.c 项目: svn2github/xqf
void host_cache_save (void) {
  GSList *hosts;
  char *hostcache;
  struct zstream z;

  hosts = hosts_to_cache ();
  host_cache_clear ();
  host_cache = hosts;

  hostcache = file_in_dir (user_rcdir, HOSTCACHE_FILE);

  if (host_cache) {
    zstream_open_w (&z, hostcache);
    if (z.f) {
      host_cache_save_list (z.f, host_cache);
      zstream_close (&z);
    }
  }
  else {
    zstream_unlink (hostcache);
  }

  g_free (hostcache);
}
示例#16
0
文件: srv-prop.c 项目: IR4T4/xqf
void props_load (void) {
	FILE *f;
	char *fn;
	struct host *h;
	struct server_props *p = NULL;
	char *addr;
	unsigned short port;
	char buf[1024];
	char *ptr;

	props_free_all ();

	fn = file_in_dir (user_rcdir, SERVERS_FILE);
	f = fopen (fn, "r");
	g_free (fn);
	if (!f)
		return;

	while (!feof (f)) {
		fgets (buf, 1024, f);

		if (buf[0] == '\n') {
			if (p)
				p = NULL;
		}
		else if (buf[0] == '[') {
			if (p)
				continue;

			ptr = strchr (&buf[1], ']');
			if (!ptr)
				continue;
			*ptr = '\0';

			if (!parse_address (&buf[1], &addr, &port))
				continue;

			if (port == 0) {
				g_free (addr);
				continue;
			}

			h = host_add (addr);
			g_free (addr);
			if (!h)
				continue;

			p = __properties (h, port);
			if (!p)
				p = properties_new (h, port);
		}
		else {
			if (!p)
				continue;

			ptr = strchr (buf, ' ');
			if (!ptr)
				continue;

			*ptr++ = '\0';

			if (strcmp (buf, "custom_cfg") == 0) {
				g_free (p->custom_cfg);
				p->custom_cfg = strdup_strip (ptr);
			}
			else if (strcmp (buf, "password") == 0) {
				g_free (p->server_password);
				p->server_password = strdup_strip (ptr);
			}
			else if (strcmp (buf, "spectator_password") == 0) {
				g_free (p->spectator_password);
				p->spectator_password = strdup_strip (ptr);
			}
			else if (strcmp (buf, "rcon_password") == 0) {
				g_free (p->rcon_password);
				p->rcon_password = strdup_strip (ptr);
			}
			else if (strcmp (buf, "reserved_slots") == 0) {
				p->reserved_slots= atoi(ptr);
			}
			else if (strcmp (buf, "sucks") == 0) {
				p->sucks = atoi(ptr);
			}
			else if (strcmp (buf, "comment") == 0) {
				unsigned di, si;
				size_t slen = strlen(ptr);
				int quote = 0;

				g_free (p->comment);
				p->comment = g_malloc0 (slen + 1);
				for (si = 0, di = 0; si < slen; ++si) {
					if (quote) {
						quote = 0;
						if (ptr[si] == 'n')
							p->comment[di++] = '\n';
						else if (ptr[si] == '\\')
							p->comment[di++] = '\\';
						else
							xqf_warning("unknown control sequence \\%c", ptr[si]);
					}
					else if (ptr[si] == '\\') {
						quote = 1;
					}
					else {
						p->comment[di++] = ptr[si];
					}
				}
			}
		}
	}

	fclose (f);
}
示例#17
0
文件: rc.c 项目: svn2github/xqf
int rc_parse (void) {
  char *fn;
  struct keyword *kw;

  fn = file_in_dir (user_rcdir, RC_FILE);
  rc_open (fn);
  g_free (fn);

  if(!rc)
    return -1;

  while ((token = rc_next_token ()) != TOKEN_EOF) {

    switch (token) {

    case TOKEN_KEYWORD:
      for (kw = keywords; kw->name; kw++) {
	if (strcmp (token_str, kw->name) == 0) {

	  switch (kw->required) {
	  case KEYWORD_INT:
	    if (rc_expect_token (TOKEN_INT))
	      config_set_int (kw->config, token_int);
	    break;

	  case KEYWORD_BOOL:
	    if (rc_expect_token (TOKEN_INT))
	      config_set_bool (kw->config, token_int);
	    break;

	  case KEYWORD_STRING:
	    if (rc_expect_token (TOKEN_STRING))
	      config_set_string (kw->config, token_str);
	    break;
	  }

	  break;
	}
      }
      break;

    case TOKEN_EOL:
    case TOKEN_EOF:
      break;

    default:
      syntax_error ();
      rc_skip_to_eol ();
      break;

    } /* switch */
  } /* while */

  rc_close ();

  /* Compatibility with old versions */

  if (!games[Q1_SERVER].dir && games[QW_SERVER].dir) {
    games[Q1_SERVER].dir = g_strdup (games[QW_SERVER].dir);
    config_set_string ("/" CONFIG_FILE "/Game: QS/dir", games[Q1_SERVER].dir);
  }

  if (default_w_switch < 0) default_w_switch = 0;
  if (default_b_switch < 0) default_b_switch = 0;

  return 0;
}
示例#18
0
文件: srv-prop.c 项目: IR4T4/xqf
void props_save (void) {
	FILE *f;
	char *fn;
	GSList *list;
	struct server_props *p;

	fn = file_in_dir (user_rcdir, SERVERS_FILE);

	if (props_list) {
		f = fopen (fn, "w");
		chmod (fn, S_IRUSR | S_IWUSR);
		g_free (fn);
		if (!f)
			return;
	}
	else {
		unlink (fn);
		g_free (fn);
		return;
	}

	for (list = props_list; list; list = list->next) {
		p = (struct server_props *) list->data;

		if (p->custom_cfg || p->server_password || p->spectator_password || p->rcon_password || p->reserved_slots
				|| p->sucks || (p->comment && strlen(p->comment))) {
			fprintf (f, "[%s:%d]\n", inet_ntoa (p->host->ip), p->port);

			if (p->custom_cfg)
				fprintf (f, "custom_cfg %s\n", p->custom_cfg);
			if (p->server_password)
				fprintf (f, "password %s\n", p->server_password);
			if (p->spectator_password)
				fprintf (f, "spectator_password %s\n", p->spectator_password);
			if (p->rcon_password)
				fprintf (f, "rcon_password %s\n", p->rcon_password);
			if (p->reserved_slots)
				fprintf (f, "reserved_slots %d\n", p->reserved_slots);
			if (p->sucks)
				fprintf (f, "sucks %d\n", p->sucks);

			if (p->comment && strlen(p->comment)) {
				char* s = p->comment;

				// strip trailing \n, otherwise one is added each time the server is saved
				while (s[strlen(s)-1] == '\n')
					s[strlen(s)-1] = '\0';

				fputs("comment ", f);
				while (*s) {
					switch(*s) {
						case '\n':
							fputs("\\n", f);
							break;
						case '\\':
							fputs("\\\\", f);
							break;
						default:
							fputc(*s, f);
							break;
					}
					++s;
				}
				fputc('\n', f);
			}

			fprintf (f, "\n");
		}
	}

	fclose (f);
}