static const char *add_icon(cmd_parms *cmd, void *d, char *icon, char *to) { char *iconbak = ap_pstrdup(cmd->pool, icon); if (icon[0] == '(') { char *alt; char *cl = strchr(iconbak, ')'); if (cl == NULL) { return "missing closing paren"; } alt = ap_getword_nc(cmd->pool, &iconbak, ','); *cl = '\0'; /* Lose closing paren */ add_alt(cmd, d, &alt[1], to); } if (cmd->info == BY_PATH) { if (!strcmp(to, "**DIRECTORY**")) { to = "^^DIRECTORY^^"; } } if (cmd->info == BY_ENCODING) { ap_str_tolower(to); } push_item(((autoindex_config_rec *) d)->icon_list, cmd->info, to, cmd->path, iconbak); return NULL; }
static const char *modperl_cmd_parse_args(apr_pool_t *p, const char *args, apr_table_t **t) { const char *orig_args = args; char *pair, *key, *val; *t = apr_table_make(p, 2); while (*(pair = ap_getword(p, &args, ',')) != '\0') { key = ap_getword_nc(p, &pair, '='); val = pair; if (!(*key && *val)) { return apr_pstrcat(p, "invalid args spec: ", orig_args, NULL); } apr_table_set(*t, key, val); } return NULL; }
/* * ic_server_setup() * ----------------- * Do the actual primary/backup server setup on behalf of the * ic_server_cmd() and ic_serverbackup_cmd() functions. */ static const char *ic_server_setup(cmd_parms *parms,void *mconfig,int server,const char *arg) { static char errmsg[100]; ic_conf_rec *conf_rec = (ic_conf_rec *)mconfig; ic_socket_rec *sock_rec = conf_rec->server[server]; sock_rec->address = ap_pstrdup(parms->pool,arg); if (sock_rec->address == NULL) return "not enough memory for the socket address"; /* * verify type of the argument, which will indicate * whether we should be using a UNIX or Inet socket * to connect to the Interchange server */ if (*arg == '/'){ /* * this is to be a UNIX socket */ struct sockaddr_un *unix_sock; unix_sock = (struct sockaddr_un *)ap_pcalloc(parms->pool,sizeof(struct sockaddr_un)); if (unix_sock == NULL){ sprintf(errmsg,"not enough memory for %s UNIX socket structure",server ? "primary" : "backup"); return errmsg; } unix_sock->sun_family = AF_LOCAL; ap_cpystrn(unix_sock->sun_path,sock_rec->address,sizeof(unix_sock->sun_path)); sock_rec->sockaddr = (struct sockaddr *)unix_sock; sock_rec->size = SUN_LEN(unix_sock); sock_rec->family = PF_LOCAL; }else{ /* * this is to be an INET socket * * the argument is an IP address or hostname followed by * an optional port specification */ struct sockaddr_in *inet_sock; char **hostaddress; char *hostname; inet_sock = (struct sockaddr_in *)ap_pcalloc(parms->pool,sizeof(struct sockaddr_in)); if (inet_sock == NULL){ sprintf(errmsg,"not enough memory for %s INET socket structure",server ? "primary" : "backup"); return errmsg; } inet_sock->sin_family = AF_INET; hostaddress = &(sock_rec->address); hostname = ap_getword_nc(parms->temp_pool,hostaddress,':'); if (!inet_aton(hostname,&inet_sock->sin_addr)){ /* * address must point to a hostname */ struct hostent *host = ap_pgethostbyname(parms->temp_pool,hostname); if (!host) return "invalid hostname specification"; memcpy(&inet_sock->sin_addr,host->h_addr,sizeof(inet_sock->sin_addr)); } /* * check if a port number has been specified */ if (**hostaddress){ int port = atoi(*hostaddress); if (port <= 100 || port > 65535) return "invalid port specification"; inet_sock->sin_port = htons(port); }else{ inet_sock->sin_port = htons(IC_DEFAULT_PORT); } sock_rec->sockaddr = (struct sockaddr *)inet_sock; sock_rec->family = PF_INET; sock_rec->size = sizeof(struct sockaddr_in); } return NULL; }