📄 config.c
字号:
* Read a section of configuration file (INI style file) * @param in configuration file * @param section section to read * @param tds_conf_parse callback that receive every entry in section * @param param parameter to pass to callback function */inttds_read_conf_section(FILE * in, const char *section, TDSCONFPARSE tds_conf_parse, void *param){ char line[256], *value;#define option line char *s; char p; int i; int insection = 0; int found = 0; tdsdump_log(TDS_DBG_INFO1, "Looking for section %s.\n", section); while (fgets(line, sizeof(line), in)) { s = line; /* skip leading whitespace */ while (*s && TDS_ISSPACE(*s)) s++; /* skip it if it's a comment line */ if (*s == ';' || *s == '#') continue; /* read up to the = ignoring duplicate spaces */ p = 0; i = 0; while (*s && *s != '=') { if (!TDS_ISSPACE(*s)) { if (TDS_ISSPACE(p)) option[i++] = ' '; option[i++] = tolower((unsigned char) *s); } p = *s; s++; } option[i] = '\0'; /* skip if empty option */ if (!i) continue; /* skip the = */ if (*s) s++; /* skip leading whitespace */ while (*s && TDS_ISSPACE(*s)) s++; /* read up to a # ; or null ignoring duplicate spaces */ value = s; p = 0; i = 0; while (*s && *s != ';' && *s != '#') { if (!TDS_ISSPACE(*s)) { if (TDS_ISSPACE(p)) value[i++] = ' '; value[i++] = *s; } p = *s; s++; } value[i] = '\0'; if (option[0] == '[') { s = strchr(option, ']'); if (s) *s = '\0'; tdsdump_log(TDS_DBG_INFO1, "\tFound section %s.\n", &option[1]); if (!strcasecmp(section, &option[1])) { tdsdump_log(TDS_DBG_INFO1, "Got a match.\n"); insection = 1; found = 1; } else { insection = 0; } } else if (insection) { tds_conf_parse(option, value, param); } } tdsdump_log(TDS_DBG_INFO1, "\tReached EOF\n"); return found;#undef option}static voidtds_parse_conf_section(const char *option, const char *value, void *param){ TDSCONNECTION *connection = (TDSCONNECTION *) param; tdsdump_log(TDS_DBG_INFO1, "\t%s = '%s'\n", option, value); if (!strcmp(option, TDS_STR_VERSION)) { tds_config_verstr(value, connection); } else if (!strcmp(option, TDS_STR_BLKSZ)) { if (atoi(value)) connection->block_size = atoi(value); } else if (!strcmp(option, TDS_STR_SWAPDT)) { connection->broken_dates = tds_config_boolean(value); } else if (!strcmp(option, TDS_STR_SWAPMNY)) { connection->broken_money = tds_config_boolean(value); } else if (!strcmp(option, TDS_STR_DUMPFILE)) { tds_dstr_copy(&connection->dump_file, value); } else if (!strcmp(option, TDS_STR_DEBUGFLAGS)) { char *end; long l; errno = 0; l = strtol(value, &end, 0); if (errno == 0 && *end == 0) connection->debug_flags = l; } else if (!strcmp(option, TDS_STR_TIMEOUT) || !strcmp(option, TDS_STR_QUERY_TIMEOUT)) { if (atoi(value)) connection->query_timeout = atoi(value); } else if (!strcmp(option, TDS_STR_CONNTIMEOUT)) { if (atoi(value)) connection->connect_timeout = atoi(value); } else if (!strcmp(option, TDS_STR_HOST)) { char tmp[256]; tdsdump_log(TDS_DBG_INFO1, "Found host entry %s.\n", value); tds_dstr_copy(&connection->server_host_name, value); tds_lookup_host(value, tmp); tds_dstr_copy(&connection->ip_addr, tmp); tdsdump_log(TDS_DBG_INFO1, "IP addr is %s.\n", tds_dstr_cstr(&connection->ip_addr)); } else if (!strcmp(option, TDS_STR_PORT)) { if (atoi(value)) connection->port = atoi(value); } else if (!strcmp(option, TDS_STR_EMUL_LE)) { connection->emul_little_endian = tds_config_boolean(value); } else if (!strcmp(option, TDS_STR_TEXTSZ)) { if (atoi(value)) connection->text_size = atoi(value); } else if (!strcmp(option, TDS_STR_CHARSET)) { tds_dstr_copy(&connection->server_charset, value); tdsdump_log(TDS_DBG_INFO1, "%s is %s.\n", option, tds_dstr_cstr(&connection->server_charset)); } else if (!strcmp(option, TDS_STR_CLCHARSET)) { tds_dstr_copy(&connection->client_charset, value); tdsdump_log(TDS_DBG_INFO1, "tds_config_login: %s is %s.\n", option, tds_dstr_cstr(&connection->client_charset)); } else if (!strcmp(option, TDS_STR_LANGUAGE)) { tds_dstr_copy(&connection->language, value); } else if (!strcmp(option, TDS_STR_APPENDMODE)) { tds_g_append_mode = tds_config_boolean(value); } else if (!strcmp(option, TDS_STR_INSTANCE)) { tds_dstr_copy(&connection->instance_name, value); } else if (!strcmp(option, TDS_STR_ENCRYPTION)) { tds_config_encryption(value, connection); } else { tdsdump_log(TDS_DBG_INFO1, "UNRECOGNIZED option '%s' ... ignoring.\n", option); }}static voidtds_config_login(TDSCONNECTION * connection, TDSLOGIN * login){ if (!tds_dstr_isempty(&login->server_name)) { tds_dstr_dup(&connection->server_name, &login->server_name); } if (login->major_version || login->minor_version) { connection->major_version = login->major_version; connection->minor_version = login->minor_version; } if (!tds_dstr_isempty(&login->language)) { tds_dstr_dup(&connection->language, &login->language); } if (!tds_dstr_isempty(&login->server_charset)) { tds_dstr_dup(&connection->server_charset, &login->server_charset); } if (!tds_dstr_isempty(&login->client_charset)) { tds_dstr_dup(&connection->client_charset, &login->client_charset); tdsdump_log(TDS_DBG_INFO1, "tds_config_login: %s is %s.\n", "client_charset", tds_dstr_cstr(&connection->client_charset)); } if (!tds_dstr_isempty(&login->client_host_name)) { tds_dstr_dup(&connection->client_host_name, &login->client_host_name); } if (!tds_dstr_isempty(&login->app_name)) { tds_dstr_dup(&connection->app_name, &login->app_name); } if (!tds_dstr_isempty(&login->user_name)) { tds_dstr_dup(&connection->user_name, &login->user_name); } if (!tds_dstr_isempty(&login->password)) { /* for security reason clear memory */ tds_dstr_zero(&connection->password); tds_dstr_dup(&connection->password, &login->password); } if (!tds_dstr_isempty(&login->library)) { tds_dstr_dup(&connection->library, &login->library); } if (login->encryption_level) { connection->encryption_level = login->encryption_level; } if (login->suppress_language) { connection->suppress_language = 1; } if (login->bulk_copy) { connection->bulk_copy = 1; } if (login->block_size) { connection->block_size = login->block_size; } if (login->port) { connection->port = login->port; tds_dstr_copy(&connection->instance_name, ""); } if (login->connect_timeout) connection->connect_timeout = login->connect_timeout; if (login->query_timeout) connection->query_timeout = login->query_timeout; /* copy other info not present in configuration file */ memcpy(connection->capabilities, login->capabilities, TDS_MAX_CAPABILITY);}static voidtds_config_env_tdsdump(TDSCONNECTION * connection){ char *s; char *path; pid_t pid = 0; if ((s = getenv("TDSDUMP"))) { if (!strlen(s)) { pid = getpid(); if (asprintf(&path, pid_logpath, pid) >= 0) tds_dstr_set(&connection->dump_file, path); } else { tds_dstr_copy(&connection->dump_file, s); } tdsdump_log(TDS_DBG_INFO1, "Setting 'dump_file' to '%s' from $TDSDUMP.\n", tds_dstr_cstr(&connection->dump_file)); }}static voidtds_config_env_tdsport(TDSCONNECTION * connection){ char *s; if ((s = getenv("TDSPORT"))) { connection->port = tds_lookup_port(s); tds_dstr_copy(&connection->instance_name, ""); tdsdump_log(TDS_DBG_INFO1, "Setting 'port' to %s from $TDSPORT.\n", s); } return;}static voidtds_config_env_tdsver(TDSCONNECTION * connection){ char *tdsver; if ((tdsver = getenv("TDSVER"))) { tds_config_verstr(tdsver, connection); tdsdump_log(TDS_DBG_INFO1, "Setting 'tdsver' to %s from $TDSVER.\n", tdsver); } return;}/* TDSHOST env var, pkleef@openlinksw.com 01/21/02 */static voidtds_config_env_tdshost(TDSCONNECTION * connection){ char *tdshost; char tmp[256]; if ((tdshost = getenv("TDSHOST"))) { tds_dstr_copy(&connection->server_host_name, tdshost); tds_lookup_host(tdshost, tmp); tds_dstr_copy(&connection->ip_addr, tmp); tdsdump_log(TDS_DBG_INFO1, "Setting 'ip_addr' to %s (%s) from $TDSHOST.\n", tmp, tdshost); }}/** * Set TDS version from given string * @param tdsver tds string version * @param connection where to store information */voidtds_config_verstr(const char *tdsver, TDSCONNECTION * connection){ if (!strcmp(tdsver, "42") || !strcmp(tdsver, "4.2")) { connection->major_version = 4; connection->minor_version = 2; return; } else if (!strcmp(tdsver, "46") || !strcmp(tdsver, "4.6")) { connection->major_version = 4; connection->minor_version = 6; return; } else if (!strcmp(tdsver, "50") || !strcmp(tdsver, "5.0")) { connection->major_version = 5; connection->minor_version = 0; return; } else if (!strcmp(tdsver, "70") || !strcmp(tdsver, "7.0")) { connection->major_version = 7; connection->minor_version = 0; return; } else if (!strcmp(tdsver, "80") || !strcmp(tdsver, "8.0")) { connection->major_version = 8; connection->minor_version = 0; return;#ifdef ENABLE_DEVELOPING } else if (!strcmp(tdsver, "90") || !strcmp(tdsver, "9.0")) { connection->major_version = 9; connection->minor_version = 0; return;#endif } else if (!strcmp(tdsver, "0.0")) { connection->major_version = 0; connection->minor_version = 0; return; }}/** * Set the full name of interface file * @param interf file name */inttds_set_interfaces_file_loc(const char *interf){ /* Free it if already set */ if (interf_file != NULL) TDS_ZERO_FREE(interf_file); /* If no filename passed, leave it NULL */ if ((interf == NULL) || (interf[0] == '\0')) { return TDS_SUCCEED; } /* Set to new value */ if ((interf_file = strdup(interf)) == NULL) { return TDS_FAIL; } return TDS_SUCCEED;}/** * Given a servername lookup the hostname. The server ip will be stored * in the string 'ip' in dotted-decimal notation. * * If we can't determine the IP address then 'ip' will be set to empty * string. *//* TODO callers seem to set always connection info... change it */voidtds_lookup_host(const char *servername, /* (I) name of the server */ char *ip /* (O) dotted-decimal ip address of server */ ){ struct hostent *host = NULL; unsigned int ip_addr = 0; /* Storage for reentrant getaddrby* calls */ struct hostent result; char buffer[4096]; int h_errnop; /* * Only call gethostbyname if servername is not an ip address. * This call take a while and is useless for an ip address. * mlilback 3/2/02 */ ip_addr = inet_addr(servername); if (ip_addr != INADDR_NONE) { tds_strlcpy(ip, servername, 17); return; } host = tds_gethostbyname_r(servername, &result, buffer, sizeof(buffer), &h_errnop); ip[0] = '\0'; if (host) { struct in_addr *ptr = (struct in_addr *) host->h_addr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -