static void final_cleanup(void) { #if SFX_LEVEL>=ARJSFXV file_close(aistream); aistream=NULL; file_close(atstream); atstream=NULL; #else if(atstream!=NULL) fclose(atstream); #endif #if SFX_LEVEL>=ARJSFXV if(tmp_tmp_filename!=NULL&&!keep_tmp_file&&tmp_tmp_filename[0]!='\0') file_unlink(tmp_tmp_filename); #else if(tmp_tmp_filename[0]!='\0') file_unlink(tmp_tmp_filename); #endif #if SFX_LEVEL>=ARJSFXV&&(TARGET!=UNIX||defined(HAVE_FCLOSEALL)) fcloseall(); #endif if(quiet_mode) freopen(dev_con, m_w, stdout); #if SFX_LEVEL>=ARJSFXV if(ferror(stdout)) msg_fprintf(stderr, M_DISK_FULL); if(debug_enabled&&strchr(debug_opt, 't')!=NULL) { ticks=get_ticks()-ticks; msg_cprintf(0, M_FINAL_TIMING, ticks); } #endif }
int do_addform( REQUEST *r, RESPONSE *resp ) { #ifndef MODIFY do_error(r, resp, LDAP_OTHER, NOT_IMPLEMENTED, MSG_NOT_SUPPORTED, NULL); return NOTOK; #else /* defined MODIFY */ int rc, in_home; char *bind_as, *pw, *args, *tmpl, *basedn, *rdn, *ufn, *cp; LDAPMessage *res; struct timeval timeout; struct ldap_disptmpl *templ; /* * query = default Base-DN, * args = dn=BindDN&userPassword=PASSWD&tmpl=template&basedn=DN */ args = r->r_method == POST ? r->r_postdata : r->r_filter; #ifdef WEB500GW_DEBUG Web500gw_debug(WEB500GW_DEBUG_TRACE, "do_addform (%s, %s)\n", r->r_dn, args ? args : "", 0, 0); #endif if (args == NULL) { do_error(r, resp, LDAP_OTHER, BAD_REQUEST, NULL, NULL); return NOTOK; } bind_as = pw = tmpl = basedn = NULL; cp = args; while (cp && *cp) { if (strncmp(cp, "dn=", 3) == 0) { bind_as = cp + 3; } else if (strncmp(cp, "userPassword="******"tmpl=", 5) == 0) { tmpl = cp + 5; } else if (strncmp(cp, "basedn=", 7) == 0) { basedn = cp + 7; } /* else ignore */ cp = strchr(cp, '&'); if (cp && *cp) *cp++ = '\0'; } if (!bind_as) { do_error(r, resp, LDAP_OTHER, BAD_REQUEST, MSG_NO_BIND_DN, NULL); return NOTOK; } hex_qdecode(bind_as); if (! pw) { do_error(r, resp, LDAP_OTHER, BAD_REQUEST, MSG_MISSING_PASSWORD, NULL); return NOTOK; } hex_qdecode(pw); if (basedn && *basedn) { hex_qdecode(basedn); } else { basedn = r->r_dn; } hex_qdecode(tmpl); if (tmpl && *tmpl) /* overrides the template in URL */ r->r_template = tmpl; if (! (r->r_template && *r->r_template)) { /* need a objectclass template */ do_error(r, resp, LDAP_OTHER, BAD_REQUEST, MSG_TEMPLATE_MISSING, NULL); return NOTOK; } /* No bind necessary at this stage but checking it anyway to block * non-admins */ if ((!bind_as) || strlen(bind_as) == 0) { /* No DN to bind as */ do_error (r, resp, LDAP_INAPPROPRIATE_AUTH, BAD_REQUEST, MSG_UNKNOWN_ARGUMENT, NULL); return NOTOK; } r->r_binddn = bind_as; if ((!pw) || strlen(pw) == 0) { /* we need a password for simple auth */ do_error (r, resp, LDAP_INAPPROPRIATE_AUTH, 0, MSG_NULL_PASSWORD, NULL); return NOTOK; } #ifdef WEB500GW_DEBUG Web500gw_debug(WEB500GW_DEBUG_TRACE, "BINDING as %s ... ", bind_as, 0, 0, 0); #endif if ((r->r_ld = web500gw_ldap_init(r, resp, bind_as, pw, 1)) == (LDAP *)0) return NOTOK; #ifdef WEB500GW_DEBUG Web500gw_debug(WEB500GW_DEBUG_TRACE, "BOUND\n", 0, 0, 0, 0); #endif /* let's see if basedn exists ... */ timeout.tv_sec = timelimit; timeout.tv_usec = 0; if ((rc = ldap_search_st(r->r_ld, basedn, LDAP_SCOPE_BASE, default_filter, NULL, 0, &timeout, &res)) != LDAP_SUCCESS) { /* better error description here ??? */ do_error(r, resp, rc, 0, get_ldap_error_str(r->r_ld), get_ldap_matched_str(r->r_ld)); return NOTOK; } /* check if nonleaf here ??? */ ufn = friendly_dn(resp, basedn); rdn = friendly_rdn(resp, basedn, 1); in_home = isinhome(basedn); /* find the requested template */ templ = ldap_name2template(r->r_template, r->r_access->a_tmpllist); if (templ == NULL) { /* template not found */ do_error(r, resp, LDAP_OTHER, BAD_REQUEST, MSG_TEMPLATE_MISSING, NULL); return NOTOK; } /* .. and see if it's allowed to add such an entry */ if (!LDAP_IS_DISPTMPL_OPTION_SET(templ, LDAP_DTMPL_OPT_ADDABLE)) { do_error(r, resp, LDAP_OTHER, BAD_REQUEST, MSG_ADD_OC_NOT_ADDABLE, NULL); return NOTOK; } if (r->r_httpversion == 1 && resp->resp_httpheader == 0) { /* Expires now - don't allow to cache */ /* resp->resp_expires = 0; */ http_header(r, resp); } if (resp->resp_htmlheader == 0) { msg_fprintf(fp, in_home && *MSG_HTML_START_MISC_HOME ? MSG_HTML_START_MISC_HOME : MSG_HTML_START_MISC, "sss", MSG_ADD, rdn, ufn); resp->resp_htmlheader = 1; } msg_fprintf(fp, MSG_EXPLAIN_ADD, "ss", rdn, ufn); fprintf(fp, "<FORM METHOD=POST ACTION=\"%s\">\n", dn2url(r, basedn, FLAG_LANGUAGE|FLAG_TMPL, ACTION_ADD, NULL, NULL)); if (r->r_browser->b_opts & B_HIDDEN) { fprintf(fp, "<INPUT TYPE=\"hidden\" NAME=\"adder_dn\" VALUE=\"%s\">\n\ <INPUT TYPE=\"hidden\" NAME=\"adder_pw\" VALUE=\"%s\">\n", html_encode(bind_as, strlen(bind_as)), html_encode(pw, strlen(pw))); } else {
int do_search( REQUEST *r, RESPONSE *resp ) { char *filtertype, **search_attrs, *search_filter; char *print_filter, *human_filter; int scope, count = 0, rc, i = 0, j, in_home; int option_param; struct timeval timeout; LDAPFiltInfo *fi; LDAPMessage *e, *res; static char *def_attrs[] = {"objectClass", "sn", "aliasedObjectName", "labeledURI", 0}; struct ldap_disptmpl *tmpl; char **oc; char *result_dn, *doc, *foc, *url_dn; char *base_dn, *base_ufn, *result_ufn, *alias_ufn, *sortstring, *cp, *bp; char **sn, href[10 * BUFSIZ], *temp, **val, *server = NULL; int counter = 0, base_len, isalias = 0; #ifdef WEB500GW_DEBUG Web500gw_debug(WEB500GW_DEBUG_TRACE, "do_search (%s, %s, (", r->r_dn, flag2string(r->r_flags), 0, 0); while (r->r_attrs && r->r_attrs[i]) { Web500gw_debug(WEB500GW_DEBUG_TRACE, "%s ", r->r_attrs[i], 0, 0, 0); i++; } Web500gw_debug(WEB500GW_DEBUG_TRACE, "), %s)\n", (r->r_filter && *r->r_filter) ? r->r_filter : "No filter", 0, 0, 0); #endif if (r->r_ld == (LDAP *)0 && (r->r_ld = web500gw_ldap_init(r, resp, NULL, NULL, 1)) == NULL) return NOTOK; base_dn = r->r_dn; if (strlen(base_dn) > 0) { base_ufn = friendly_dn(resp, base_dn); } else { base_ufn = NULL; } base_len = base_ufn ? strlen(base_ufn) : 0; if (r->r_filter == NULL) { return NOTOK; } print_filter = r->r_filter; #if defined(OWN_STR_TRANSLATION) search_filter = strdup(web500gw_isotot61(r->r_filter)); #else search_filter = r->r_filter; #endif if (*search_filter == '\0' || *(search_filter+1) != '=') { scope = LDAP_SCOPE_ONELEVEL; } else { if (*search_filter == 'S') { scope = LDAP_SCOPE_SUBTREE; } else { scope = LDAP_SCOPE_ONELEVEL; } search_filter += 2; print_filter += 2; } /* make a "human readable filter" - for now, no artistic things are done */ human_filter = print_filter; if ((cp = strchr(print_filter, '=')) != NULL) { if ((cp = strchr(cp+1, '=')) != NULL) { /* two '=' in it - must be a complex filter - isn't readable... */ human_filter = MSG_COMPLEX_FILTER; } } if (*search_filter) { /* not the default filter */ r->r_flags |= FLAG_FILTER; /* skip leading white spaces */ while (isspace(*search_filter)) ++search_filter; } if (r->r_attrs == NULL || *r->r_attrs == NULL) { /* No attributes requested - read default attrs for sorting */ search_attrs = def_attrs; } else { j = 0; while (def_attrs[j]) j++; search_attrs = (char **) calloc(r->r_attrnumb + j + 1, sizeof(char *)); i = j = 0; while (r->r_attrs && r->r_attrs[i]) { search_attrs[i] = r->r_attrs[i]; i++; } while (def_attrs[j]) search_attrs[i++] = def_attrs[j++]; search_attrs[i] = NULL; } if ((in_home = isinhome(base_dn))) /* ACCESS sizelimit if searching below HOME DN */ ldap_set_option(r->r_ld, LDAP_OPT_SIZELIMIT, &(r->r_access->a_sizelimit)); else ldap_set_option(r->r_ld, LDAP_OPT_SIZELIMIT, &sizelimit); /* A simple filter (not starting with '(') with a comma in it * -> UFN assumed */ /* if (ufnsearch && search_filter[0] != '(' && strchr(search_filter, ',') != NULL && strlen(search_filter) > 3) { if (strlen(base_dn) > 0) ldap_ufn_setprefix(r->r_ld, base_dn); timeout.tv_sec = timelimit; timeout.tv_usec = 0; ldap_ufn_timeout((void *) &timeout); option_param = LDAP_DEREF_FINDING; ldap_set_option(r->r_ld, LDAP_OPT_DEREF, (void *) &option_param); #ifdef WEB500GW_DEBUG Web500gw_debug(WEB500GW_DEBUG_TRACE, "ldap_ufn_search_s (%s)\n", search_filter, 0, 0, 0); #endif if ((rc = ldap_ufn_search_s(r->r_ld, search_filter, search_attrs, 0, &res)) != LDAP_SUCCESS && rc != LDAP_SIZELIMIT_EXCEEDED) { do_error(r, resp, rc, 0, get_ldap_result_code(r->r_ld), get_ldap_matched_str(r->r_ld)); return NOTOK; } count = ldap_count_entries(r->r_ld, res); #ifdef WEB500GW_DEBUG Web500gw_debug(WEB500GW_DEBUG_TRACE, "UFN ready: %d results!\n", count, 0, 0, 0); #endif // Reset DN, because this UFN search was probably not below DN base_dn = base_ufn = ""; in_home = 0; friendlyDesc = MSG_UFN; } else { */ /* let's do the search */ filtertype = (scope == LDAP_SCOPE_ONELEVEL ? "web500gw onelevel" : "web500gw subtree"); option_param = (scope == LDAP_SCOPE_ONELEVEL ? LDAP_DEREF_FINDING : LDAP_DEREF_ALWAYS); ldap_set_option(r->r_ld, LDAP_OPT_DEREF, (void *) &option_param); timeout.tv_sec = timelimit; timeout.tv_usec = 0; friendlyDesc = NULL; /* try all filters til we have success */ for (fi = ldap_getfirstfilter(r->r_access->a_filtd, filtertype, search_filter); fi != NULL; fi = ldap_getnextfilter(r->r_access->a_filtd)) { #ifdef WEB500GW_DEBUG Web500gw_debug(WEB500GW_DEBUG_FILTER, " search %s: %s -- %s\n", scope == LDAP_SCOPE_ONELEVEL ? "onelevel" : "subtree", fi->lfi_filter, fi->lfi_desc, 0); #endif if ((rc = ldap_search_st(r->r_ld, base_dn, scope, fi->lfi_filter, search_attrs, 0, &timeout, &res)) != LDAP_SUCCESS && rc != LDAP_SIZELIMIT_EXCEEDED && rc != LDAP_INSUFFICIENT_ACCESS && rc != LDAP_TIMELIMIT_EXCEEDED && rc != LDAP_TIMEOUT && rc != LDAP_PARTIAL_RESULTS) { do_error(r, resp, rc, 0, get_ldap_result_code(r->r_ld), get_ldap_matched_str(r->r_ld)); return NOTOK; } if ((count = ldap_count_entries(r->r_ld, res)) > 0) { /* found something */ friendlyDesc = friendly_label(resp, fi->lfi_desc); #ifdef WEB500GW_DEBUG Web500gw_debug(WEB500GW_DEBUG_FILTER, " searched ... and found %d results!\n", count, 0, 0, 0); #endif break; } #ifdef WEB500GW_DEBUG Web500gw_debug(WEB500GW_DEBUG_FILTER, " searched ... and found no results!\n", 0, 0, 0, 0); #endif } option_param = LDAP_DEREF_ALWAYS; ldap_set_option(r->r_ld, LDAP_OPT_DEREF, (void *) &option_param); /* }*/ if (count < 1) { /* nothing found :-( */ if (r->r_flags & FLAG_SEARCHACT) { /* in a search action we silently ignore this */ return OK; } resp->resp_status = NOT_FOUND; if (resp->resp_httpheader == 0) { if (r->r_httpversion == 1) { /* Expires now */ resp->resp_expires = 0; http_header(r, resp); } if (r->r_method == HEAD) { return OK; } } if (resp->resp_htmlheader == 0) { msg_fprintf(fp, in_home && *MSG_HTML_START_NO_SEARCH_RESULTS_HOME ? MSG_HTML_START_NO_SEARCH_RESULTS_HOME : MSG_HTML_START_NO_SEARCH_RESULTS, "ss", print_filter, base_ufn ? base_ufn : MSG_ROOT); resp->resp_htmlheader = 1; if (!(r->r_flags & FLAG_ENTRYONLY)) { if (in_home && MSG_HOMEBANNER) { msg_fprintf(fp, MSG_HOMEBANNER, "sss", r->r_query, other_lang_select, other_lang_string); } else { msg_fprintf(fp, MSG_BANNER, "sss", r->r_query, other_lang_select, other_lang_string); } } if (rc == LDAP_INSUFFICIENT_ACCESS) { fputs(MSG_NO_LIST_ACCESS, fp); } else if (rc == LDAP_TIMELIMIT_EXCEEDED || rc == LDAP_TIMEOUT) { fputs(MSG_TIMELIMIT, fp); } else { if (print_filter && *print_filter) { msg_fprintf(fp, MSG_NO_SEARCH_RESULTS, "ssss", (scope == LDAP_SCOPE_ONELEVEL ? MSG_ONELEVEL : MSG_SUBTREE), print_filter, human_filter, base_ufn ? base_ufn : MSG_ROOT); } else { fputs(MSG_NOTHING_FOUND_READORSEARCH, fp); } } if (!(r->r_flags & FLAG_ENTRYONLY)) { make_upsearch(r->r_ld, r, resp, 1); if (in_home && MSG_HOMETRAILER) { fputs(MSG_HOMETRAILER, fp); } else { fputs(MSG_TRAILER, fp); } } fputs(MSG_HTML_END, fp); fputs("\n", fp); } else { /* resp->resp_htmlheader != 0 -> within a document (searchaction) */ if (rc == LDAP_INSUFFICIENT_ACCESS) { fputs(MSG_NO_LIST_ACCESS, fp); } else if (rc == LDAP_TIMELIMIT_EXCEEDED || rc == LDAP_TIMEOUT) { fputs(MSG_TIMELIMIT, fp); } else { fputs(MSG_NOTHING_FOUND_READORSEARCH, fp); fputs(MSG_HTML_END, fp); fputs("\n", fp); } } return OK; } if (showonematch == 1 && count == 1 && r->r_attrnumb == 0 && !(r->r_flags & FLAG_SEARCHACT)) { /* header != 0 ? */ /* only one result and not searching for special attrs (searchaction) */ e = ldap_first_entry(r->r_ld, res); if (e != NULL) { char **oc, **aliasdn; oc = ldap_get_values(r->r_ld, e, objectclass_attr); aliasdn = ldap_get_values(r->r_ld, e, "aliasedObjectName"); if (aliasdn && *aliasdn) result_dn = *aliasdn; else result_dn = ldap_get_dn(r->r_ld, e); if (result_dn) { result_ufn = friendly_dn(resp, result_dn); if (gwswitch) { server = gw_switch(r->r_ld, resp, e); } r->r_flags &= ~FLAG_FILTER; /* it's not a search anymore */ url_dn = dn2url(r, result_dn, server ? r->r_flags & ~FLAG_LANGUAGE : r->r_flags, 0, NULL, server); /* Redirect */ #ifdef WEB500GW_DEBUG Web500gw_debug(WEB500GW_DEBUG_TRACE, "do_search: found one entry -> REDIRECT: %s\n", url_dn, 0, 0, 0); #endif resp->resp_status = REDIRECT; if (resp->resp_httpheader == 0 && r->r_httpversion == 1) { resp->resp_location = malloc(strlen(url_dn) + 11); strcpy(resp->resp_location, url_dn); http_header(r, resp); /* free(resp->resp_location); */ } if (r->r_method == HEAD) { return OK; } msg_fprintf(fp, in_home && *MSG_HTML_START_SEARCH_RESULTS_HOME ? MSG_HTML_START_SEARCH_RESULTS_HOME : MSG_HTML_START_SEARCH_RESULTS, "ss", print_filter, result_ufn); msg_fprintf(fp, MSG_REDIRECT, "ss", url_dn, result_ufn); fputs(MSG_HTML_END, fp); fputs("\n", fp); return OK; } } } /* Found something */ /* Prepare HTTP + HTML header */ if (resp->resp_httpheader == 0 && r->r_httpversion == 1) { http_header(r, resp); if (r->r_method == HEAD) return OK; } if (resp->resp_htmlheader == 0) { msg_fprintf(fp, in_home && *MSG_HTML_START_SEARCH_RESULTS_HOME ? MSG_HTML_START_SEARCH_RESULTS_HOME : MSG_HTML_START_SEARCH_RESULTS, "ss", print_filter, base_ufn ? base_ufn : MSG_ROOT); if (!(r->r_flags & FLAG_ENTRYONLY)) { if (in_home && MSG_HOMEBANNER) { msg_fprintf(fp, MSG_HOMEBANNER, "sss", r->r_query, other_lang_select, other_lang_string); } else { msg_fprintf(fp, MSG_BANNER, "sss", r->r_query, other_lang_select, other_lang_string); } } resp->resp_htmlheader = 1; } if ((!(r->r_flags & FLAG_ENTRYONLY)) && (r->r_browser->b_upsearch & UPSEARCH_ON_TOP)) { make_upsearch(r->r_ld, r, resp, 1); } if (r->r_flags & FLAG_FILTER && (!(r->r_flags & FLAG_ENTRYONLY))) { /* Not the default filter and not entryonly */ msg_fprintf(fp, MSG_SEARCH_RESULTS, "ssssisss", (scope == LDAP_SCOPE_ONELEVEL ? MSG_ONELEVEL : MSG_SUBTREE), print_filter, human_filter, base_ufn && *base_ufn ? base_ufn : MSG_ROOT, count, count == 1 ? MSG_ENTRY : MSG_ENTRIES, friendlyDesc, rc == LDAP_PARTIAL_RESULTS ? resp->resp_language->l_conf->c_errmsg[LDAP_PARTIAL_RESULTS] : ""); } if (ldap_result2error(r->r_ld, res, 0) == LDAP_SIZELIMIT_EXCEEDED) { fprintf(fp, r->r_flags & FLAG_FILTER && r->r_access->a_sizelimit == 0 ? MSG_SIZELIMIT_1 : MSG_SIZELIMIT_0, count); } /* Now prepare the result for sorting */ #ifdef WEB500GW_DEBUG Web500gw_debug(WEB500GW_DEBUG_TRACE, "do_search: preparing for sort\n", 0, 0, 0, 0); #endif /* for all the results ... */ for (e = ldap_first_entry(r->r_ld, res); e != NULL && counter < MAX_LISTSIZE; e = ldap_next_entry(r->r_ld, e)) { result_dn = ldap_get_dn(r->r_ld, e); result_ufn = friendly_dn(resp, result_dn); if ((val = ldap_get_values(r->r_ld, e, "aliasedObjectName"))) { /* entry is alias */ free(result_dn); result_dn = strdup(*val); alias_ufn = friendly_dn(resp, result_dn); ldap_value_free(val); isalias = 1; } else { isalias = 0; } if (isalias && r->r_flags & FLAG_DEREFALIAS) { /* if alias, look for objectClass of real entry */ oc = deref(r->r_ld, result_dn); } else { oc = ldap_get_values(r->r_ld, e, objectclass_attr); } /* find template to see the plural name of the objectclass */ tmpl = ldap_oc2template(oc, r->r_access->a_tmpllist); doc = pick_oc(oc); if (tmpl && tmpl->dt_pluralname) { foc = strdup(friendly_label(resp, tmpl->dt_pluralname)); } else { foc = strdup(friendly_label(resp, doc)); if (strcmp(foc, doc) == 0) { /* "no friendly objectclass" found -> last in the list (a hack) */ foc = (char *)malloc(strlen(doc)+9); sprintf(foc, " %s", doc); } } if (strncasecmp(result_ufn, "{ASN}", 5) == 0) { /* ASNs are not something we want to display! */ free(result_dn); ldap_value_free(oc); continue; } if (base_len > 0) { /* strip search base from result */ result_ufn = strip_ufn_dn(result_ufn, base_ufn); } #ifdef nodef cp = result_ufn + strlen(result_ufn) - 1; bp = base_ufn + base_len - 1; while (bp >= base_ufn && *cp-- && *bp-- && *cp == *bp); if ((bp+1) == base_ufn && cp != NULL) { /* Complete match on base */ /* strip trailing whitespaces and ',' */ while (*cp && isspace(*cp)) cp--; if (cp != NULL && *cp == ',') *cp = '\0'; } } #endif sortstring = strdup(result_ufn); if (strcasecmp(doc, "country") == 0) { /* a country */ sn = NULL; } else { /* not a country */ /* DNs may have components in '"', ignored when sorting */ if (*sortstring == '"') { sortstring++; cp = strchr(sortstring+1, '"'); } else { cp = sortstring; } if ((cp = strchr(cp,','))) *cp = '\0'; if (isalias) { /* aliases don't have surnames */ if (isoc (oc, "person")) { } } sn = ldap_get_values(r->r_ld, e, "sn"); /* Delete spaces ??? if (sn) { cp = *sn; while ((cp = strchr(cp,' '))) { cp ++; spaces ++; } } while (spaces > 0) { if ((cp = strrchr(sortstring,' '))) { *cp = '\0'; spaces --; } else break; } */ if ((cp = strchr(sortstring,'+'))) { cp --; *cp = '\0'; } } if (gwswitch) { server = gw_switch(r->r_ld, resp, e); } /* build the link (HREF) */ if (isalias) { if (isnonleaf(r->r_ld, oc, result_dn)) { if (r->r_flags & FLAG_NOHREFDN) msg_snprintf(href, sizeof(href), MSG_DN_ALIAS_TO_NONLEAF, "sss", result_ufn, alias_ufn, html_encode(result_dn)); else msg_snprintf(href, sizeof(href), MSG_HREF_ALIAS_TO_NONLEAF, "ssssss", dn2url(r, result_dn, server ? 0 : FLAG_LANGUAGE, 0, NULL, server), result_ufn, alias_ufn, html_encode(result_dn), string_encode(result_ufn),string_encode(result_dn)); } else { if (r->r_flags & FLAG_NOHREFDN) msg_snprintf(href, sizeof(href), MSG_DN_ALIAS_TO_LEAF, "sss", result_ufn, alias_ufn, html_encode(result_dn)); else msg_snprintf(href, sizeof(href), MSG_HREF_ALIAS_TO_LEAF, "ssssss", dn2url(r, result_dn, server ? 0 : FLAG_LANGUAGE, 0, NULL, server), result_ufn, alias_ufn, html_encode(result_dn), string_encode(result_ufn),string_encode(result_dn)); } } else if (isnonleaf(r->r_ld, oc, result_dn)) { if (r->r_flags & FLAG_NOHREFDN) msg_snprintf(href, sizeof(href), MSG_DN_NON_LEAF, "ss", result_ufn, html_encode(result_dn)); else msg_snprintf(href, sizeof(href), MSG_HREF_NON_LEAF, "sssss", dn2url(r, result_dn, server ? 0 : FLAG_LANGUAGE, 0, NULL, server), result_ufn, html_encode(result_dn), string_encode(result_ufn), string_encode(result_dn)); } else { if (r->r_flags & FLAG_NOHREFDN) msg_snprintf(href, sizeof(href), MSG_DN_LEAF, "ss", result_ufn, html_encode(result_dn)); else msg_snprintf(href, sizeof(href), MSG_HREF_LEAF, "sssss", dn2url(r, result_dn, server ? 0 : FLAG_LANGUAGE, 0, NULL, server), result_ufn, html_encode(result_dn), string_encode(result_ufn), string_encode(result_dn)); } /* build the sortstring: foc[sn]sortstring */ if (sn) { temp = (char *) malloc(strlen(foc)+strlen(*sn)+strlen(sortstring)+1); } else { temp = (char *) malloc(strlen(foc)+strlen(sortstring)+1); } strcpy(temp, foc); if (sn) { strcat(temp, *sn); } strcat(temp, sortstring); if (!dnlist[counter]) { dnlist[counter] = (struct dncompare *) malloc(sizeof(struct dncompare)); } dnlist[counter]->sortstring = temp; dnlist[counter]->href = strdup(href); dnlist[counter]->friendly_oc = foc; dnlist[counter]->oc = doc; dnlist[counter]->tmpl = tmpl; dnlist[counter]->entry = e; dnlist[counter]->dn = strdup(result_dn); counter++; ldap_value_free(oc); free(result_dn); if (sn) ldap_value_free(sn); }
void uxspecial_stats(char FAR *storage, int format) { #if TARGET==UNIX FMSGP fm; #endif #if SFX_LEVEL>=ARJ char tmp[FILENAME_MAX-1]; char FAR *dptr; int i, l, m, id; #endif if(format==UXSTATS_SHORT) { /* Only relevant under UNIX when extracting the files */ #if TARGET==UNIX switch(UXSB_GET_ID(storage[0])) { case UXSB_FIFO: fm=M_UXSPECIAL_FIFO; break; case UXSB_HLNK: fm=M_UXSPECIAL_HLNK; break; case UXSB_LNK: fm=M_UXSPECIAL_LNK; break; case UXSB_CHR: fm=M_UXSPECIAL_CHR; break; case UXSB_BLK: fm=M_UXSPECIAL_BLK; break; default: return; } msg_fprintf(new_stdout, fm); fputc(' ', new_stdout); #endif } #if SFX_LEVEL>=ARJ else { l=UXSB_GET_SIZE(storage[0]); if(l==UXSB_SIZE_THRESHOLD) l=mget_word(storage+1); id=UXSB_GET_ID(storage[0]); dptr=storage+((UXSB_GET_SIZE(*storage)==UXSB_SIZE_THRESHOLD)?3:1); switch(id) { case UXSB_FIFO: arj_user_msg(M_UXLIST_FIFO); break; case UXSB_HLNK: case UXSB_LNK: if(l>=sizeof(tmp)) l=sizeof(tmp)-1; far_memmove((char FAR *)tmp, dptr, l); tmp[l]='\0'; msg_sprintf(misc_buf, (id==UXSB_HLNK)?M_UXLIST_HLNK:M_UXLIST_LNK, tmp); arj_user_msg(misc_buf); break; case UXSB_BLK: case UXSB_CHR: m=0; tmp[0]='\0'; for(i=0; i<l&&m<sizeof(tmp)-4; i++) m+=sprintf(tmp+m, "%02x ", (unsigned char)dptr[i]); if(m>0) tmp[m-1]='\0'; msg_sprintf(misc_buf, (id==UXSB_BLK)?M_UXLIST_BLK:M_UXLIST_CHR, tmp); arj_user_msg(misc_buf); break; } } #endif }