Patch: Elm ME+ 2.5 PLalpha46 -> Elm ME+ 2.5 PLalpha47 [5/7] (7/7)
From
Kari Hurtta@21:1/5 to
All on Sat Feb 10 14:46:35 2018
[continued from previous message]
+ const ns_type q_type;
+ const int is_search;
+ enum looking_up * looking_up_p;
+ char ** search_name_p;
+ int * have_error_p;
+ int * other_p;
+ struct cancel_data ** cancel_p
+ /* May be NULL, Used if dns lookup was cancelable
+ -- not really canceled, just
+ stop waiting of result
+ */;
+ {
+ struct resolv_cache * ret = NULL;
+ int err = 0;
+ struct resolv_query_item * query = NULL;
+ int root_searched = 0;
+ int dots = -1;
+
+ struct check_query_answer_f flags = NULL_check_query_answer_f;
+
+ if (cancel_p && !*cancel_p) {
+
+ enum name_lookup_cancel_v cancel_mode = give_dt_enumerate_as_int(&name_lookup_cancel);
+
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: name-lookup-cancel = %d\n",
+ name,cancel_mode));
+
+ switch (cancel_mode) {
+ case name_lookup_cancel_enabled:
+ case name_lookup_cancel_auto: /* "auto" applies to non-blocking queries */
+ *cancel_p =
+ new_schedule_cancel(100 /* print after 100 ms */,
+ CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvLookingUp,
+ "Looking up %s ..."),
+ name);
+ break;
+ case name_lookup_cancel_disabled:
+ case NUM_name_lookup_cancel:
+ break;
+ }
+ }
+
+
+ if (have_error_p)
+ flags.have_error = 0 != *have_error_p;
+ if (other_p)
+ flags.other = 0 != *other_p;
+
+ if (is_search) {
+ const char *c;
+ const char * found_dot = NULL;
+ const char * alias;
+
+ dots = 0;
+
+ for (c = name;*c; c++) {
+ if ('.' == *c) {
+ dots++;
+ found_dot = c;
+ }
+ }
+
+ DPRINT(Debug,14,(&Debug,"lookup_resolv_cache_nonblocked: %s: %d dots\n",
+ name,dots));
+
+ /* Need to similar than res_search */
+
+ if (found_dot && !found_dot[1]) {
+ DPRINT(Debug,14,(&Debug,"lookup_resolv_cache_nonblocked: %s: trailing dot\n",
+ name));
+
+ query = query_one_name(record,name,NULL,now,q_type,
+ looking_up_p,&err,
+ 0 /* not search */);
+ root_searched = 1;
+
+ } else if (!dots && (alias = hostalias(name))) {
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: No dots, searching alias: %s\n",
+ name,alias));
+
+ query = query_one_name(record,alias,NULL,now,q_type,
+ looking_up_p,&err,
+ 0 /* not search */);
+ root_searched = 1;
+
+ } else {
+ char * default_domain_searched = NULL;
+
+ if (!dots && 0 != (_res.options & RES_DEFNAMES)) {
+
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: No dots, (RES_DEFNAMES) searching from default domain: %s\n",
+ name,_res.defdname));
+
+ default_domain_searched = _res.defdname;
+
+ if ( ! _res.defdname[0] || 0 == strcmp(_res.defdname,".")) {
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: ... default domain is root\n"));
+ root_searched = 1;
+ }
+
+ query = query_one_name(record,name,_res.defdname,now,q_type,
+ looking_up_p,&err,
+ 1 /* have search */);
+
+ } else if (dots >= _res.ndots) {
+
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: %d dots, doing absolute query (ndots:%d)\n",
+ name,dots,_res.ndots));
+
+ query = query_one_name(record,name,NULL,now,q_type,
+ looking_up_p,&err,
+ (_res.dnsrch[0] != '\0') /* maybe have search */);
+ root_searched = 1;
+ }
+
+ end_query_helper(&query,err,name,&ret,looking_up_p,
+ search_name_p,&flags,cancel_p);
+
+ if (!ret && cancel_p && *cancel_p &&
+ is_canceled(*cancel_p)) {
+
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: DNS lookup canceled\n",
+ name));
+
+ /* Flag this as error, so query is marked as failed */
+ if (have_error_p && !*have_error_p) {
+ DPRINT(Debug,14,(&Debug, "lookup_resolv_cache_nonblocked: %s: marking as failed\n",
+ name));
+ *have_error_p = 1;
+ }
+
+ goto fail;
+
+ } else if (!flags.end_search && !ret &&
+ !query &&
+ flags.no_name /* searching only when NRXDOMAIN was previous result */
+ &&
+ 0 != (_res.options & RES_DNSRCH) &&
+ (dots ||
+ 0 != (_res.options & RES_DEFNAMES))
+ ) {
+
+ int x;
+
+
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: %d dots%s, (RES_DNSRCH) using search list\n",
+ name,dots,
+ 0 != (_res.options & RES_DEFNAMES) ? " (RES_DEFNAMES)" : ""));
+
+ for (x = 0 ;
+ x < (sizeof _res.dnsrch) / sizeof (_res.dnsrch[0]) &&
+ _res.dnsrch[x] &&
+ !flags.end_search && !ret &&
+ !query &&
+ flags.no_name /* searching only when NRXDOMAIN was previous result */;
+ x++) {
+
+ if (default_domain_searched &&
+ 0 == strcmp(default_domain_searched,
+ _res.dnsrch[x])) {
+
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: skipping %d: %s (default domain already searched)\n",
+ name, x, _res.dnsrch[x]));
+
+ } else {
+ int is_root =
+ ( ! _res.dnsrch[x][0] || 0 == strcmp( _res.dnsrch[x],"."));
+
+ if (root_searched && is_root) {
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: skipping %d: %s (root already searched)\n",
+ name,x, _res.dnsrch[x]));
+
+ } else {
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: searching %d: %s%s\n",
+ name,x, _res.dnsrch[x],
+ is_root ? " (is root)" : ""));
+
+ query = query_one_name(record,name,_res.dnsrch[x], + now,q_type,
+ looking_up_p,&err,
+ 1 /* have search */);
+
+ if (is_root)
+ root_searched = 1;
+
+ end_query_helper(&query,err,name,&ret,looking_up_p, + search_name_p,&flags,cancel_p);
+
+ if (!ret && cancel_p && *cancel_p &&
+ is_canceled(*cancel_p)) {
+
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: DNS lookup canceled\n",
+ name));
+
+ /* Flag this as error, so query is marked as failed */
+ if (have_error_p && !*have_error_p) {
+ DPRINT(Debug,14,(&Debug, "lookup_resolv_cache_nonblocked: %s: marking as failed\n",
+ name));
+ *have_error_p = 1;
+ }
+
+ goto fail;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ } else
+ flags.no_name = 1; /* searching only when NRXDOMAIN was previous result */
+
+ /* dots == -1 not search
+ dots >= 0 search
+ */
+
+ if (!flags.end_search && !ret &&
+ !query && !root_searched &&
+ flags.no_name /* searching only when NRXDOMAIN was previous result */
+ #ifdef RES_NOTLDQUERY
+ && (dots != 0 || 0 == (_res.options & RES_NOTLDQUERY) )
+ #endif
+ ) {
+
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: ",
+ name));
+ if (dots < 0) {
+ DPRINT(Debug,14,(&Debug, "not search"));
+ } else {
+ DPRINT(Debug,14,(&Debug, "search, dots %d",
+ dots));
+ }
+ DPRINT(Debug,14,(&Debug, ", doing absolute query\n"));
+
+ query = query_one_name(record,name,NULL,now,q_type,
+ looking_up_p,&err,
+ 0 /* is not search */);
+
+ end_query_helper(&query,err,name,&ret,looking_up_p,
+ search_name_p,&flags,cancel_p);
+
+ if (!ret && cancel_p && *cancel_p &&
+ is_canceled(*cancel_p)) {
+
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked: %s: DNS lookup canceled\n",
+ name));
+
+ /* Flag this as error, so query is marked as failed */
+ if (have_error_p && !*have_error_p) {
+ DPRINT(Debug,14,(&Debug, "lookup_resolv_cache_nonblocked: %s: marking as failed\n",
+ name));
+ *have_error_p = 1;
+ }
+
+ goto fail;
+ }
+ }
+
+ if (have_error_p)
+ *have_error_p = flags.have_error;
+ else if (flags.have_error && (!looking_up_p &&
+ *looking_up_p < l_up_error)) {
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvLookingUpSomeFailure,
+ "Looking up %s: some failure?"),
+ name);
+
+ if (looking_up_p)
+ *looking_up_p = l_up_error;
+ }
+
+ if (other_p)
+ *other_p = flags.other;
+ else if (flags.other && (!looking_up_p &&
+ *looking_up_p < l_up_error)) {
+
+ lib_transient(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvLookNoData,
+ "Looking up %s: no data"),
+ name);
+
+ if (looking_up_p)
+ *looking_up_p = l_up_error;
+
+ }
+
+ fail:
+
+ if (query) {
+ free_resolv_query_item(&query);
+ }
+
+ DPRINT(Debug,14,(&Debug,
+ "lookup_resolv_cache_nonblocked=%d (%s): %s",
+ ret,
+ ret ? "have result" : "no result",
+ name));
+
+ if (search_name_p && *search_name_p) {
+ DPRINT(Debug,14,(&Debug,"; search name = %s",
+ *search_name_p));
+ }
+
+ DPRINT(Debug,14,(&Debug,"\n"));
+ return ret;
+ }
+
+
+ struct resolv_query_mode nonblocked_query_mode = {
+ RESOLV_QUERY_MODE_magic,
+ have_non_blocking_qm,
+ lookup_resolv_cache_nonblocked
+ };
+
+
+ const char * QUERY_MODE[NUM_query_mode] = { "blocking",
+ "non-blocking" };
+
+ enum query_mode_val query_mode =
+ #if defined(RESOLV_SENDOK) && defined(RESOLV_SEQPACKET) && defined(BACKGROUD_PROCESSES)
+ qm_non_blocking
+ #else
+ qm_blocking
+ #endif
+ ;
+
+ const struct resolv_query_mode * query_modes [NUM_query_mode] = {
+ &blocked_query_mode,
+ &nonblocked_query_mode
+ };
+
+ static const char * HELPER_INTERRUPT[NUM_helper_interrupt] = {
+ "allow-interrupt",
+ "ignore-interrupt",
+ };
+
+ static char * query_mode_func_return_buffer = NULL;
+
+ void free_resolv_config()
+ {
+ if (query_mode_func_return_buffer) {
+ free(query_mode_func_return_buffer);
+ query_mode_func_return_buffer = NULL;
+ }
+ }
+
+ enum query_mode_param_kw {
+ qmp_helper,
+ qmp_helper_skip_limit,
+ qmp_parallel_lookup_max_time,
+ NUM_query_mode_param
+ };
+
+ static const char * QUERY_MODE_PARAM[NUM_query_mode_param] = {
+ "helper",
+ "helper-skip-limit",
+ "parallel-lookup-max-time"
+ };
+
+ int query_mode_func(value,enter,lineno,filename)
+ char **value;
+ int enter;
+ int lineno;
+ const char *filename;
+ {
+ int ok = 0;
+
+ if (enter) {
+ char * WALK;
+ char * temp = safe_strdup(*value);
+ char * f = mime_parse_content_opts(temp, &WALK);
+
+ int x;
+
+ if (!f) {
+ goto fail;
+ }
+
+ if (conf_select_value(f, QUERY_MODE,NUM_query_mode,
+ &x)) {
+ ok = 1;
+ query_mode = x;
+ }
+
+ if (ok) {
+ #ifndef RESOLV_SENDOK
+ if (query_mode) {
+ ok = 0;
+ }
+ #endif
+ #ifndef RESOLV_SEQPACKET
+ if (query_mode) {
+ ok = 0;
+ }
+ #endif
+ #ifndef BACKGROUD_PROCESSES
+ if (query_mode) {
+ ok = 0;
+ }
+ #endif
+ if (!ok) {
+ if (filename)
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvParallelLookupNotAvailFile,
+ "Parallel DNS lookup is not availeble (query-mode keyword %s on line %d on file %s)"),
+ f,lineno,filename);
+ else
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvParallelLookupNotAvail,
+ "Parallel DNS lookup is not availeble (query-mode keyword %s)"),
+ f);
+
+ query_mode = 0;
+ }
+
+
+ } else {
+
+ if (filename)
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvUnknowKeywordPLFile,
+ "Unknown query-mode keyword %s on line %d on file %s"),
+ f,lineno,filename);
+ else
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvUnknowKeywordPL,
+ "Unknown query-mode keyword %s"),
+ f);
+ }
+
+ while (NULL != (f = mime_parse_content_opts(NULL, &WALK))) {
+ /* modifies string f, return param value or NULL */
+ char * q = conf_split_param_value(f);
+ int p;
+
+ if (conf_select_value(f,QUERY_MODE_PARAM,
+ NUM_query_mode_param,
+ &p)) {
+ enum query_mode_param_kw param = p;
+
+ switch (param) {
+ case qmp_helper:
+ if (q) {
+ errno = 0;
+ if (conf_select_value(q,HELPER_INTERRUPT,
+ NUM_helper_interrupt,
+ &x)) {
+ helper_int_handling = x;
+ } else {
+ char * end = NULL;
+ long val = strtol(q,&end,10);
+ int err;
+
+ err = errno;
+
+ if (0 != err ||
+ '\0' != *end ||
+ val < 1 ||
+ val > MAX_prx_processes) {
+
+ ok = 0;
+
+ if (err) {
+ if (filename)
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPLFileErr,
+ "Bad value %s on query-mode keyword %s on line %d on file %s: %s"),
+ q,f,lineno,filename,
+ strerror(err));
+ else
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPLErr,
+ "Bad value %s on query-mode keyword %s: %s"),
+ q,f,
+ strerror(err));
+
+ } else {
+ if (filename)
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPLFile,
+ "Bad value %s on query-mode keyword %s on line %d on file %s"),
+ q,f,lineno,filename);
+ else
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPL,
+ "Bad value %s on query-mode keyword %s"),
+ q,f);
+ }
+
+ if (end > q) { /* If not keyword */
+ if (val < 1)
+ prx_max_processes = 1;
+ else if (val > MAX_prx_processes)
+ prx_max_processes = MAX_prx_processes; + else
+ prx_max_processes = val;
+ }
+
+ } else
+ prx_max_processes = val;
+ }
+
+ } else
+ goto value_missing;
+ break;
+
+ case qmp_helper_skip_limit:
+ errno = 0;
+ if (q) {
+ char * end = NULL;
+ long val = strtol(q,&end,10);
+ int err;
+
+ err = errno;
+
+ if (0 != err ||
+ '\0' != *end ||
+ val < 0 ||
+ val > MAX_prx_processes) {
+
+ ok = 0;
+
+ if (err) {
+ if (filename)
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPLFileErr,
+ "Bad value %s on query-mode keyword %s on line %d on file %s: %s"),
+ q,f,lineno,filename,
+ strerror(err));
+ else
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPLErr,
+ "Bad value %s on query-mode keyword %s: %s"),
+ q,f,
+ strerror(err));
+
+ } else {
+ if (filename)
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPLFile,
+ "Bad value %s on query-mode keyword %s on line %d on file %s"),
+ q,f,lineno,filename);
+ else
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPL,
+ "Bad value %s on query-mode keyword %s"),
+ q,f);
+ }
+
+ if (end > q) { /* If not keyword */
+ if (val < 0)
+ prx_max_skip_process = 0;
+ else if (val > MAX_prx_processes)
+ prx_max_processes = MAX_prx_processes;
+ else
+ prx_max_skip_process = val;
+ }
+
+ } else
+ prx_max_skip_process = val;
+
+ } else
+ goto value_missing;
+ break;
+
+ case qmp_parallel_lookup_max_time:
+ errno = 0;
+ if (q) {
+ char * end = NULL;
+ long val = strtol(q,&end,10);
+ int err = errno;
+
+ resolv_stalled_seconds_value[0] = '\0';
+
+ if (0 == err) {
+ if ('\0' == *end ||
+ 0 == strcmp(end,"s")) { /* seconds */
+
+ if (val >= MIN_stalled_seconds && val <= MAX_stalled_seconds) {
+ resolv_stalled_seconds = val;
+
+ if (strlen(q) < sizeof resolv_stalled_seconds_value)
+ strfcpy(resolv_stalled_seconds_value,q, + sizeof resolv_stalled_seconds_value);
+ } else {
+
+ if (val < MIN_stalled_seconds)
+ resolv_stalled_seconds = MIN_stalled_seconds;
+ else
+ resolv_stalled_seconds = MAX_stalled_seconds;
+
+ goto bad_value;
+ }
+
+ } else if ( 0 == strcmp(end,"m")) { /* minutes */ + const int factor = 60;
+
+ /* Check overflow first */
+ if (val >= MIN_stalled_seconds / factor &&
+ val <= MAX_stalled_seconds / factor) {
+
+ /* Check exact value when multiplation does not overflow */
+
+ int res = val * factor;
+
+
+ if (res >= MIN_stalled_seconds && res <= MAX_stalled_seconds) {
+ resolv_stalled_seconds = res;
+
+ if (strlen(q) < sizeof resolv_stalled_seconds_value)
+ strfcpy(resolv_stalled_seconds_value,q,
+ sizeof resolv_stalled_seconds_value);
+ } else {
+
+ if (res < MIN_stalled_seconds)
+ resolv_stalled_seconds = MIN_stalled_seconds;
+ else
+ resolv_stalled_seconds = MAX_stalled_seconds;
+
+ goto bad_value;
+ }
+
+ } else {
+ if (val < MIN_stalled_seconds / factor)
+ resolv_stalled_seconds = MIN_stalled_seconds;
+ else
+ resolv_stalled_seconds = MAX_stalled_seconds;
+
+ goto bad_value;
+ }
+
+ } else {
+ bad_value:
+ ok = 0;
+
+ if (filename)
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPLFile,
+ "Bad value %s on query-mode keyword %s on line %d on file %s"),
+ q,f,lineno,filename);
+ else
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPL,
+ "Bad value %s on query-mode keyword %s"),
+ q,f);
+ }
+
+ } else {
+ ok = 0;
+
+ if (filename)
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPLFileErr,
+ "Bad value %s on query-mode keyword %s on line %d on file %s: %s"),
+ q,f,lineno,filename,
+ strerror(err));
+ else
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvBadValueKwPLErr,
+ "Bad value %s on query-mode keyword %s: %s"),
+ q,f,
+ strerror(err));
+ }
+
+ } else {
+ value_missing:
+ ok = 0;
+
+ if (filename)
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvMissingValueKwPLFile,
+ "Missing value on query-mode keyword %s on line %d on file %s"),
+ f,lineno,filename);
+ else
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvMissingValueKwPL,
+ "Missing value on query-mode keyword %s"),
+ f);
+
+
+ }
+ break;
+
+ case NUM_query_mode_param: /* Not used */ break;
+ }
+
+ } else {
+
+ if (filename)
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvUnknowKeywordPLFile,
+ "Unknown query-mode keyword %s on line %d on file %s"),
+ f,lineno,filename);
+ else
+ lib_error(CATGETS(elm_msg_cat,
+ ResolvSet,
+ ResolvUnknowKeywordPL,
+ "Unknown query-mode keyword %s"),
+ f);
+
+ ok = 0;
+ }
+ }
+
+ fail:
+ free(temp);
+
+
+ } else {
+
+ if (query_mode >= 0 && query_mode < NUM_query_mode) {
+ query_mode_func_return_buffer =
+ strmcpy(query_mode_func_return_buffer,
+ QUERY_MODE[query_mode]);
+ ok = 1;
+ } else
+ goto fail1;
+
+ if (query_mode ||
+ helper_int_handling != DEFAULT_helper_int_handling) {
+ if (helper_int_handling >= 0 &&
+ helper_int_handling < NUM_helper_interrupt) {
+
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,"; ");
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,
+ QUERY_MODE_PARAM[qmp_helper]);
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,"=");
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,
+ HELPER_INTERRUPT[helper_int_handling]);
+
+ } else
+ ok = 0;
+ }
+
+ if (query_mode ||
+ prx_max_processes != MAX_PROCESS) {
+ if (prx_max_processes > 0) {
+
+ char * t = elm_message(FRM("; %s=%d"),
+ QUERY_MODE_PARAM[qmp_helper],
+ prx_max_processes);
+
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,t);
+ free(t);
+ } else
+ ok = 0;
+ }
+
+ if (query_mode ||
+ prx_max_skip_process != MAX_SKIP_PROCESS
+ ) {
+
+ if (prx_max_skip_process >= 0) {
+ char * t = elm_message(FRM("; %s=%d"),
+ QUERY_MODE_PARAM[qmp_helper_skip_limit],
+ prx_max_skip_process);
+
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,t);
+ free(t);
+ } else
+ ok = 0;
+ }
+
+ if (resolv_stalled_seconds_value[0]) {
+
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,"; ");
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,
+ QUERY_MODE_PARAM[qmp_parallel_lookup_max_time]);
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,"=");
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,
+ resolv_stalled_seconds_value);
+
+ } else if (query_mode ||
+ resolv_stalled_seconds != STALLED_SECONDS_DEFAULT) {
+
+ if (resolv_stalled_seconds > 0) {
+ if (resolv_stalled_seconds >= 60 &&
+ resolv_stalled_seconds % 60 == 0) {
+ int min = resolv_stalled_seconds / 60;
+
+ char * t = elm_message(FRM("; %s=%dm"),
+ QUERY_MODE_PARAM[qmp_parallel_lookup_max_time],
+ min);
+
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,t);
+ free(t);
+ } else {
+ char * t = elm_message(FRM("; %s=%ds"),
+ QUERY_MODE_PARAM[qmp_parallel_lookup_max_time],
+ resolv_stalled_seconds);
+
+ query_mode_func_return_buffer =
+ strmcat(query_mode_func_return_buffer,t);
+ free(t);
+ }
+ } else
+ ok = 0;
+ }
+
+ *value = query_mode_func_return_buffer;
+ }
+
+ fail1:
+ return ok;
+ }
+ /*
+ * Local Variables:
+ * mode:c
+ * c-basic-offset:4
+ * buffer-file-coding-system: iso-8859-1
+ * End:
+ */
+
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)