/************************************************************************ * NCSA HTTPd Server * Software Development Group * National Center for Supercomputing Applications * University of Illinois at Urbana-Champaign * 605 E. Springfield, Champaign, IL 61820 * httpd@ncsa.uiuc.edu * * Copyright (C) 1995, Board of Trustees of the University of Illinois * ************************************************************************ * * http_alias.c: Stuff for dealing with directory aliases * */ #include "config.h" #include "portability.h" #include #ifndef NO_STDLIB_H # include #endif /* NO_STDLIB_H */ #include #include #include "constants.h" #include "http_alias.h" #include "http_config.h" #include "http_log.h" #include "http_request.h" #include "util.h" /* To send stat() information to cgi.c */ int dirs_in_alias; void free_aliases(lookup *trans) { int x; for (x=0; x < trans->num_aliases ; x++) { free(trans->aliases[x].fake); free(trans->aliases[x].real); } free(trans->aliases); free(trans); } void add_lookup(per_host *host, char *fake, char *real, int type) { lookup *translations = host->translations; int n; if (translations == NULL) { translations = (lookup *) malloc(sizeof(lookup)); translations->aliases = (lookupRec *) malloc(TRANS_BEG_SIZE * sizeof(lookupRec)); translations->num_aliases = 0; translations->max_aliases = TRANS_BEG_SIZE; host->translations = translations; } if (translations->num_aliases >= translations->max_aliases) { translations->aliases = (lookupRec *) realloc(translations->aliases, ((translations->max_aliases+ TRANS_INC_SIZE) * sizeof(lookupRec))); translations->max_aliases += TRANS_INC_SIZE; } n = translations->num_aliases; translations->aliases[n].fake = strdup(fake); translations->aliases[n].fake_len = strlen(fake); translations->aliases[n].real = strdup(real); translations->aliases[n].real_len = strlen(real); translations->aliases[n].type = type; translations->num_aliases++; } void add_alias(per_host *host, char *fake, char *real, int is_script) { char tmp[MAX_STRING_LEN]; if (real[0] != '/') { make_full_path(((is_script == A_SCRIPT_CGI) ? server_root : host->document_root), real,tmp); add_lookup(host,fake,tmp,is_script); } else add_lookup(host,fake,real,is_script); } void add_redirect(per_host *host, char *fake, char *url,int type) { add_lookup(host,fake,url,type); } char fake[MAX_STRING_LEN+2],real[MAX_STRING_LEN],dname[HUGE_STRING_LEN]; int translate_name(per_request *reqInfo, char* url, char *filename) { register int x; char w[MAX_STRING_LEN]; struct passwd *pw; getparents(url); if (reqInfo->hostInfo->translations != NULL) { lookup *trans = reqInfo->hostInfo->translations; for(x=0; x < trans->num_aliases ;x++) { if(!strncmp(url,trans->aliases[x].fake, trans->aliases[x].fake_len)) { strncpy(filename,trans->aliases[x].real,HUGE_STRING_LEN); strncat(filename,url+trans->aliases[x].fake_len, HUGE_STRING_LEN - trans->aliases[x].real_len); return trans->aliases[x].type; } } } if((reqInfo->hostInfo->user_dir[0]) && (url[0] == '/') && (url[1] == '~')) { strcpy(dname,&url[2]); getword(w,dname,'/'); if(!(pw=getpwnam(w))) { /* log missing user attempt as suggested by Gioacchino La Vecchia (gio@di.unipi.it) */ log_reason(reqInfo,"user does not exist",reqInfo->url); die(reqInfo,SC_NOT_FOUND,reqInfo->url); } fake[0] = '/'; fake[1] = '~'; strcpy(&fake[2],w); make_full_path(pw->pw_dir,reqInfo->hostInfo->user_dir,real); strcpy(filename,real); strcat(filename,url+strlen(w)+2); return A_STD_DOCUMENT; } /* no alias, add document root */ strncpy(filename,reqInfo->hostInfo->document_root,HUGE_STRING_LEN); strncat(filename,url, HUGE_STRING_LEN - reqInfo->hostInfo->doc_root_len); return A_STD_DOCUMENT; }