home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / CONTRIB / HTTPD / HTTPD_SO.TAR / httpd_1.3 / src / http_alias.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-01-19  |  2.6 KB  |  115 lines

  1. /*
  2.  * http_alias.c: Stuff for dealing with directory aliases
  3.  * 
  4.  * Rob McCool
  5.  * 
  6.  */
  7.  
  8.  
  9. #include "httpd.h"
  10.  
  11. typedef struct {
  12.     char fake[MAX_STRING_LEN];
  13.     char real[MAX_STRING_LEN];
  14.     int script;
  15. } alias;
  16.  
  17. static int num_a = 0;
  18. static alias a[MAX_ALIASES];
  19. static int num_v = 0;
  20. static alias v[MAX_ALIASES];
  21.  
  22. /* To send stat() information to http_script.c */
  23. int dirs_in_alias;
  24.  
  25. void reset_aliases() {
  26.     num_a = 0;
  27.     num_v = 0;
  28. }
  29.  
  30. void add_alias(char *f, char *r, int is_script) {
  31.     strcpy(a[num_a].fake,f);
  32.  
  33.     a[num_a].script = is_script;
  34.     if(r[0] != '/') 
  35.         make_full_path((is_script ? server_root : document_root),r,
  36.                        a[num_a++].real);
  37.     else
  38.         strcpy(a[num_a++].real,r);
  39. }
  40.  
  41. void add_redirect(char *f, char *url) {
  42.     strcpy(v[num_v].fake,f);
  43.     strcpy(v[num_v++].real,url);
  44. }
  45.  
  46. int translate_name(char *name, FILE *fd) {
  47.     register int x,l;
  48.     char w[MAX_STRING_LEN];
  49.     char t[MAX_STRING_LEN];
  50.     struct passwd *pw;
  51.  
  52.     getparents(name);
  53.  
  54.     for(x=0;x<num_v;x++) {
  55.         l=strlen(v[x].fake);
  56.         if(!strncmp(name,v[x].fake,l)) {
  57.             strsubfirst(l,name,v[x].real);
  58.             return REDIRECT_URL;
  59.         }
  60.     }
  61.  
  62.     for(x=0; x < num_a; x++) {
  63.         l=strlen(a[x].fake);
  64.         if(!strncmp(name,a[x].fake,l)) {
  65.             strsubfirst(l,name,a[x].real);
  66.             dirs_in_alias = count_dirs(a[x].real);
  67.             return(a[x].script);
  68.         }
  69.     }
  70.  
  71.     if((user_dir[0]) && (name[0] == '/') && (name[1] == '~')) {
  72.         char fake[MAX_STRING_LEN],real[MAX_STRING_LEN],dname[MAX_STRING_LEN];
  73.  
  74.         strcpy(dname,&name[2]);
  75.         getword(w,dname,'/');
  76.         if(!(pw=getpwnam(w)))
  77.             die(NOT_FOUND,name,fd);
  78.         fake[0] = '/';
  79.         fake[1] = '~';
  80.         strcpy(&fake[2],w);
  81.         make_full_path(pw->pw_dir,user_dir,real);
  82.         add_alias(fake,real,STD_DOCUMENT);
  83.         strsubfirst(strlen(w) + 2,name,real);
  84.         return STD_DOCUMENT;
  85.     }
  86.     /* no alias, add document root */
  87.     strsubfirst(0,name,document_root);
  88.     return STD_DOCUMENT;
  89. }
  90.  
  91. void unmunge_name(char *name) {
  92.     register int x,l;
  93.  
  94.     l=strlen(document_root);
  95.     if(!strncmp(name,document_root,l)) {
  96.         strsubfirst(l,name,"");
  97.         if(!name[0]) {
  98.             name[0] = '/';
  99.             name[1] = '\0';
  100.         }
  101.         return;
  102.     }
  103.     for(x=0;x < num_a; x++) {
  104.         l=strlen(a[x].real);
  105.         if(!strncmp(name,a[x].real,l)) {
  106.             strsubfirst(l,name,a[x].fake);
  107.             if(!name[0]) {
  108.                 name[0] = '/';
  109.                 name[1] = '\0';
  110.             }
  111.             return;
  112.         }
  113.     }
  114. }
  115.