2000 #include #include #include #include #include #include #include #include "connap.h" #include "command.h" #include "io.h" #include "search.h" #include "config.h" #include "shared.h" /* #include "hotlist.h" */ #include "sound.h" #include "util.h" static char *rc_file; static void get_config_string(char **s, int accept_empty) { char *p; if (! (p = strtok(NULL, "\0"))) goto empty; while (isspace(*p)) p++; if (! *p) goto empty; free(*s); *s = new_string(p); return; empty: if (accept_empty) { free(*s); *s = new_string(""); } else { fprintf(stderr, "Missing configuration value in connap.cfg\n"); exit(1); } } static void get_config_int(int *val) { char *p; if (! (p = strtok(NULL, "\0"))) goto error; while (isspace(*p)) p++; if (! *p) goto error; *val = atoi(p); return; error: fprintf(stderr, "Missing configuration value in connap.cfg\n"); exit(1); } static void get_config_servers(void) { char *p, *tmp, *name, *port_string, *meta_string; SERVER *new_server, *prev_server = NULL; while (servers) { free(servers->name); p = (char*)servers; servers = servers->next; free(p); } while ((p = strtok(NULL, " \t"))) { while (isspace(*p)) p++; if (! *p) { return; } tmp = new_string(p); if (! split_server(tmp, &name, &port_string, &meta_string)) { fprintf(stderr, "Invalid server format in connap.cfg\n"); exit(1); } new_server = (SERVER*)malloc(sizeof(SERVER)); new_server->name = (char*)malloc(strlen(name) + 1); strcpy(new_server->name, name); new_server->port = atoi(port_string); new_server->meta = atoi(meta_string); new_server->next = NULL; if (! servers) servers = new_server; if (prev_server) prev_server->next = new_server; prev_server = new_server; free(tmp); } if (! servers) return; if (cur_server.name) free(cur_server.name); cur_server.name = new_string(servers->name); cur_server.port = servers->port; cur_server.meta = servers->meta; } static void get_config_auto_commands(void) { char *p, *tmp; AUTOCOMMAND *new_command, *prev_command = NULL; while ((p = strtok(NULL, ";"))) { while (isspace(*p)) p++; if (! *p) return; tmp = new_string(p); new_command = (AUTOCOMMAND*)malloc(sizeof(AUTOCOMMAND)); new_command->data = new_string(tmp); new_command->next = NULL; if (! auto_commands) auto_commands = new_command; if (prev_command) prev_command->next = new_command; prev_command = new_command; free(tmp); } } static void get_config_shared_dirs(void) { char *p; SHAREDDIR *new_dir, *prev_dir = NULL; while ((p = strtok(NULL, ":"))) { while (isspace(*p)) p++; if (! *p) return; new_dir = (SHAREDDIR *)malloc(sizeof(SHAREDDIR)); new_dir->dir_name = new_string(p); new_dir->next = NULL; if (! shared_dirs) shared_dirs = new_dir; if (prev_dir) prev_dir->next = new_dir; prev_dir = new_dir; } } static void read_config(FILE *f) { char s[4097], *p; while (fgets(s, 4096, f)) { s[strlen(s) - 1] = 0; if (! strlen(s)) continue; if (! (p = strtok(s, " \t"))) continue; if (! strcmp(p, "username")) { get_config_string(&user_info.user_name, 0); } else if (! strcmp(p, "password")) { get_config_string(&user_info.password, 0); } else if (! strcmp(p, "email")) { get_config_string(&user_info.email, 0); } else if (! strcmp(p, "dataport")) { get_config_int(&user_info.data_port); } else if (! strcmp(p, "linktype")) { get_config_int(&user_info.link_type); } else if (! strcmp(p, "registered")) { get_config_int(&user_info.registered); } else if (! strcmp(p, "dldir")) { get_config_string(&init_dl_dir, 0); } else if (! strcmp(p, "uldirs")) { get_config_shared_dirs(); } else if (! strcmp(p, "servers")) { get_config_servers(); } else if (! strcmp(p, "minlink")) { get_config_string(&cur_search.min_link, 0); def_search.min_link = new_string(cur_search.min_link); } else if (! strcmp(p, "minfreq")) { get_config_string(&cur_search.min_freq, 0); def_search.min_freq = new_string(cur_search.min_freq); } else if (! strcmp(p, "minbitrate")) { get_config_string(&cur_search.min_bitrate, 0); def_search.min_bitrate = new_string(cur_search.min_bitrate); } else if (! strcmp(p, "maxfiles")) { get_config_string(&cur_search.max_files, 0); def_search.max_files = new_string(cur_search.max_files); } else if (! strcmp(p, "showpath")) { get_config_int(&show_path); } else if (! strcmp(p, "timeout")) { get_config_int(&time_out); } else if (! strcmp(p, "autocommands")) { get_config_auto_commands(); } else if (! strcmp(p, "chanmsg_sound")) { get_config_string(&sound[CHANMSG_SOUND], 1); } else if (! strcmp(p, "privmsg_sound")) { get_config_string(&sound[PRIVMSG_SOUND], 1); } else if (! strcmp(p, "join_sound")) { get_config_string(&sound[JOIN_SOUND], 1); } else if (! strcmp(p, "part_sound")) { get_config_string(&sound[PART_SOUND], 1); /* } else if (! strcmp(p, "FILELIST")) { read_file_list(f); } else if (! strcmp(p, "HOTLIST")) { read_hot_list(f); */ } else { fprintf(stderr, "Invalid option '%s'\n", p); exit(1); } } fclose(f); } void write_config(void) { FILE *f; SERVER *srv; SHAREDDIR *dir; AUTOCOMMAND *ac; if (! (f = fopen(rc_file, "w"))) { err_msg(strerror(errno)); return; } fprintf(f, "username %s\n", user_info.user_name); fprintf(f, "password %s\n", user_info.password); fprintf(f, "email %s\n", user_info.email); fprintf(f, "dataport %d\n", user_info.data_port); fprintf(f, "linktype %d\n", user_info.link_type); fprintf(f, "registered %d\n", user_info.registered); fprintf(f, "\n"); fprintf(f, "dldir %s\n", init_dl_dir); fprintf(f, "uldirs "); for (dir = shared_dirs; dir; dir = dir->next) { fprintf(f, "%s", dir->dir_name); if (dir->next) fprintf(f, ":"); } fprintf(f, "\n\n"); fprintf(f, "servers "); for (srv = servers; srv; srv = srv->next) { fprintf(f, "%s:%04d:%d ", srv->name, srv->port, srv->meta); } fprintf(f, "\n\n"); fprintf(f, "minlink %s\n", def_search.min_link); fprintf(f, "minfreq %s\n", def_search.min_freq); fprintf(f, "minbitrate %s\n", def_search.min_bitrate); fprintf(f, "maxfiles %s\n", def_search.max_files); fprintf(f, "\n"); fprintf(f, "showpath %d\n", show_path); fprintf(f, "timeout %d\n", time_out); fprintf(f, "\n"); fprintf(f, "autocommands "); for (ac = auto_commands; ac; ac = ac->next) { fprintf(f, "%s", ac->data); if (ac->next) fprintf(f, "; "); } /* fprintf(f, "\n\n"); fprintf(f, "FILELIST\n"); save_file_list(f); fprintf(f, "\n"); fprintf(f, "HOTLIST\n"); save_hot_list(f); */ fclose(f); } void config(int argc, char **argv) { FILE *f; char *home_dir, *tmp; if ((tmp = getenv("HOME"))) init_dl_dir = new_string(tmp); else init_dl_dir = new_string("c:\\"); user_info.user_name = new_string("NewUser"); user_info.password = new_string("password"); user_info.email = new_string("foo@bar.com"); user_info.data_port = 6699; user_info.link_type = 4; user_info.registered = 0; cur_search.artist = new_string(""); cur_search.title = new_string(""); cur_search.min_link = new_string("4"); cur_search.min_freq = new_string("4 344 4100"); cur_search.min_bitrate = new_string("128"); cur_search.max_files = new_string("100"); def_search.min_link = new_string(cur_search.min_link); def_search.min_freq = new_string(cur_search.min_freq); def_search.min_bitrate = new_string(cur_search.min_bitrate); def_search.max_files = new_string(cur_search.max_files); servers = (SERVER*)malloc(sizeof(SERVER)); servers->name = new_string("bitchx.dimension6.com"); servers->port = 8888; servers->meta = 0; servers->next = NULL; cur_server.name = new_string(servers->name); cur_server.port = servers->port; cur_server.meta = servers->meta; if (argc > 1) rc_file = new_string(argv[1]); else rc_file = new_string("connap.cfg"); if ((f = fopen(rc_file, "r"))) read_config(f); } . 0