⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 config.c

📁 在Linux/Unix下面访问WINDOWS SQLSERVER 的ODBC驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
 * 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 + -