/* * format_view_margin - return sane value for vertical margins */ int * format_view_margin(void) { static int margin[2]; char tmp[100], e[200], *err, lastchar = 0; int left = 0, right = 0, leftm = 0, rightm = 0; size_t l; memset(margin, 0, sizeof(margin)); /* * We initially tried to make sure that the user didn't shoot themselves * in the foot by setting this too small. People seem to want to do some * strange stuff, so we're going to relax the wild shot detection and * let people set what they want, until we get to the point of totally * absurd. We've also added the possibility of appending the letter c * onto the width. That means treat the value as an absolute column * instead of a width. That is, a right margin of 76c means wrap at * column 76, whereas right margin of 4 means to wrap at column * screen width - 4. */ if(ps_global->VAR_VIEW_MARGIN_LEFT){ strncpy(tmp, ps_global->VAR_VIEW_MARGIN_LEFT, sizeof(tmp)-1); tmp[sizeof(tmp)-1] = '\0'; removing_leading_and_trailing_white_space(tmp); if(tmp[0]){ l = strlen(tmp); if(l > 0) lastchar = tmp[l-1]; if(lastchar == 'c') tmp[l-1] = '\0'; if((err = strtoval(tmp, &left, 0, 0, 0, e, sizeof(e), "Viewer-margin-left")) != NULL){ leftm = 0; dprint((2, "%s\n", err)); } else{ if(lastchar == 'c') leftm = left-1; else leftm = left; leftm = MIN(MAX(0, leftm), ps_global->ttyo->screen_cols); } } } if(ps_global->VAR_VIEW_MARGIN_RIGHT){ strncpy(tmp, ps_global->VAR_VIEW_MARGIN_RIGHT, sizeof(tmp)-1); tmp[sizeof(tmp)-1] = '\0'; removing_leading_and_trailing_white_space(tmp); if(tmp[0]){ l = strlen(tmp); if(l > 0) lastchar = tmp[l-1]; if(lastchar == 'c') tmp[l-1] = '\0'; if((err = strtoval(tmp, &right, 0, 0, 0, e, sizeof(e), "Viewer-margin-right")) != NULL){ rightm = 0; dprint((2, "%s\n", err)); } else{ if(lastchar == 'c') rightm = ps_global->ttyo->screen_cols - right; else rightm = right; rightm = MIN(MAX(0, rightm), ps_global->ttyo->screen_cols); } } } if((rightm > 0 || leftm > 0) && rightm >= 0 && leftm >= 0 && ps_global->ttyo->screen_cols - rightm - leftm >= 8){ margin[0] = leftm; margin[1] = rightm; } return(margin); }
/* * Break up the ldap-server string stored in the pinerc into its * parts. The structure is allocated here and should be freed by the caller. * * The original string looks like * <servername>[:port] <SPACE> "/base=<base>/impl=1/..." * * Args serv_str -- The original string from the pinerc to parse. * * Returns A pointer to a structure with filled in answers. * * Some of the members have defaults. If port is -1, that means to use * the default LDAP_PORT. If base is NULL, use "". Type and srch have * defaults defined in alpine.h. If cust is non-NULL, it overrides type and * srch. */ LDAP_SERV_S * break_up_ldap_server(char *serv_str) { char *lserv; char *q, *p, *tail; int i, only_one = 1; LDAP_SERV_S *info = NULL; if(!serv_str) return(info); info = (LDAP_SERV_S *)fs_get(sizeof(LDAP_SERV_S)); /* * Initialize to defaults. */ memset((void *)info, 0, sizeof(*info)); info->port = -1; info->srch = -1; info->type = -1; info->time = -1; info->size = -1; info->scope = -1; /* copy the whole string to work on */ lserv = cpystr(serv_str); if(lserv) removing_trailing_white_space(lserv); if(!lserv || !*lserv || *lserv == '"'){ if(lserv) fs_give((void **)&lserv); if(info) free_ldap_server_info(&info); return(NULL); } tail = lserv; while((tail = strindex(tail, SPACE)) != NULL){ tail++; if(*tail == '"' || *tail == '/'){ *(tail-1) = '\0'; break; } else only_one = 0; } /* tail is the part after server[:port] <SPACE> */ if(tail && *tail){ removing_leading_white_space(tail); (void)removing_double_quotes(tail); } /* get the optional port number */ if(only_one && (q = strindex(lserv, ':')) != NULL){ int ldapport = -1; *q = '\0'; if((ldapport = atoi(q+1)) >= 0) info->port = ldapport; } /* use lserv for serv even though it has a few extra bytes alloced */ info->serv = lserv; if(tail && *tail){ /* get the search base */ if((q = srchstr(tail, "/base=")) != NULL) info->base = remove_backslash_escapes(q+6); if((q = srchstr(tail, "/binddn=")) != NULL) info->binddn = remove_backslash_escapes(q+8); /* get the implicit parameter */ if((q = srchstr(tail, "/impl=1")) != NULL) info->impl = 1; /* get the rhs parameter */ if((q = srchstr(tail, "/rhs=1")) != NULL) info->rhs = 1; /* get the ref parameter */ if((q = srchstr(tail, "/ref=1")) != NULL) info->ref = 1; /* get the nosub parameter */ if((q = srchstr(tail, "/nosub=1")) != NULL) info->nosub = 1; /* get the tls parameter */ if((q = srchstr(tail, "/tls=1")) != NULL) info->tls = 1; /* get the tlsmust parameter */ if((q = srchstr(tail, "/tlsm=1")) != NULL) info->tlsmust = 1; /* get the search type value */ if((q = srchstr(tail, "/type=")) != NULL){ NAMEVAL_S *v; q += 6; if((p = strindex(q, '/')) != NULL) *p = '\0'; for(i = 0; (v = ldap_search_types(i)); i++) if(!strucmp(q, v->name)){ info->type = v->value; break; } if(p) *p = '/'; } /* get the search rule value */ if((q = srchstr(tail, "/srch=")) != NULL){ NAMEVAL_S *v; q += 6; if((p = strindex(q, '/')) != NULL) *p = '\0'; for(i = 0; (v = ldap_search_rules(i)); i++) if(!strucmp(q, v->name)){ info->srch = v->value; break; } if(p) *p = '/'; } /* get the scope */ if((q = srchstr(tail, "/scope=")) != NULL){ NAMEVAL_S *v; q += 7; if((p = strindex(q, '/')) != NULL) *p = '\0'; for(i = 0; (v = ldap_search_scope(i)); i++) if(!strucmp(q, v->name)){ info->scope = v->value; break; } if(p) *p = '/'; } /* get the time limit */ if((q = srchstr(tail, "/time=")) != NULL){ q += 6; if((p = strindex(q, '/')) != NULL) *p = '\0'; /* This one's a number */ if(*q){ char *err; err = strtoval(q, &i, 0, 500, 0, tmp_20k_buf, SIZEOF_20KBUF, "ldap timelimit"); if(err){ dprint((1, "%s\n", err ? err : "?")); } else info->time = i; } if(p) *p = '/'; } /* get the size limit */ if((q = srchstr(tail, "/size=")) != NULL){ q += 6; if((p = strindex(q, '/')) != NULL) *p = '\0'; /* This one's a number */ if(*q){ char *err; err = strtoval(q, &i, 0, 500, 0, tmp_20k_buf, SIZEOF_20KBUF, "ldap sizelimit"); if(err){ dprint((1, "%s\n", err ? err : "?")); } else info->size = i; } if(p) *p = '/'; } /* get the custom search filter */ if((q = srchstr(tail, "/cust=")) != NULL) info->cust = remove_backslash_escapes(q+6); /* get the nickname */ if((q = srchstr(tail, "/nick=")) != NULL) info->nick = remove_backslash_escapes(q+6); /* get the mail attribute name */ if((q = srchstr(tail, "/matr=")) != NULL) info->mailattr = remove_backslash_escapes(q+6); /* get the sn attribute name */ if((q = srchstr(tail, "/satr=")) != NULL) info->snattr = remove_backslash_escapes(q+6); /* get the gn attribute name */ if((q = srchstr(tail, "/gatr=")) != NULL) info->gnattr = remove_backslash_escapes(q+6); /* get the cn attribute name */ if((q = srchstr(tail, "/catr=")) != NULL) info->cnattr = remove_backslash_escapes(q+6); /* get the backup mail address */ if((q = srchstr(tail, "/mail=")) != NULL) info->mail = remove_backslash_escapes(q+6); } return(info); }