[BACK]Return to cgi.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/cgi.c between version 1.82 and 1.83

version 1.82, 2014/07/24 20:30:45 version 1.83, 2014/07/25 16:07:13
Line 39 
Line 39 
  * A query as passed to the search function.   * A query as passed to the search function.
  */   */
 struct  query {  struct  query {
         const char      *manpath; /* desired manual directory */          char            *manpath; /* desired manual directory */
         const char      *arch; /* architecture */          char            *arch; /* architecture */
         const char      *sec; /* manual section */          char            *sec; /* manual section */
         const char      *expr; /* unparsed expression string */          char            *expr; /* unparsed expression string */
         int              equal; /* match whole names, not substrings */          int              equal; /* match whole names, not substrings */
 };  };
   
Line 58  static void   html_print(const char *);
Line 58  static void   html_print(const char *);
 static  void             html_printquery(const struct req *);  static  void             html_printquery(const struct req *);
 static  void             html_putchar(char);  static  void             html_putchar(char);
 static  int              http_decode(char *);  static  int              http_decode(char *);
 static  void             http_parse(struct req *, char *);  static  void             http_parse(struct req *, const char *);
 static  void             http_print(const char *);  static  void             http_print(const char *);
 static  void             http_putchar(char);  static  void             http_putchar(char);
 static  void             http_printquery(const struct req *);  static  void             http_printquery(const struct req *);
Line 213  html_print(const char *p)
Line 213  html_print(const char *p)
 }  }
   
 /*  /*
  * Parse out key-value pairs from an HTTP request variable.   * Transfer the responsibility for the allocated string *val
  * This can be either a cookie or a POST/GET string, although man.cgi   * to the query structure.
  * uses only GET for simplicity.  
  */   */
 static void  static void
 http_parse(struct req *req, char *p)  set_query_attr(char **attr, char **val)
 {  {
         char            *key, *val;  
   
         memset(&req->q, 0, sizeof(struct query));          free(*attr);
         req->q.manpath = req->p[0];          if (**val == '\0') {
         req->q.equal = 1;                  *attr = NULL;
                   free(*val);
           } else
                   *attr = *val;
           *val = NULL;
   }
   
         while ('\0' != *p) {  /*
                 key = p;   * Parse the QUERY_STRING for key-value pairs
                 val = NULL;   * and store the values into the query structure.
    */
   static void
   http_parse(struct req *req, const char *qs)
   {
           char            *key, *val;
           size_t           keysz, valsz;
   
                 p += (int)strcspn(p, ";&");          req->q.manpath  = NULL;
                 if ('\0' != *p)          req->q.arch     = NULL;
                         *p++ = '\0';          req->q.sec      = NULL;
                 if (NULL != (val = strchr(key, '=')))          req->q.expr     = NULL;
                         *val++ = '\0';          req->q.equal    = 1;
   
                 if ('\0' == *key || NULL == val || '\0' == *val)          key = val = NULL;
                         continue;          while (*qs != '\0') {
   
                 /* Just abort handling. */                  /* Parse one key. */
   
                 if ( ! http_decode(key))                  keysz = strcspn(qs, "=;&");
                         break;                  key = mandoc_strndup(qs, keysz);
                 if (NULL != val && ! http_decode(val))                  qs += keysz;
                         break;                  if (*qs != '=')
                           goto next;
   
                 if (0 == strcmp(key, "query"))                  /* Parse one value. */
                         req->q.expr = val;  
                 else if (0 == strcmp(key, "manpath")) {                  valsz = strcspn(++qs, ";&");
                   val = mandoc_strndup(qs, valsz);
                   qs += valsz;
   
                   /* Decode and catch encoding errors. */
   
                   if ( ! (http_decode(key) && http_decode(val)))
                           goto next;
   
                   /* Handle key-value pairs. */
   
                   if ( ! strcmp(key, "query"))
                           set_query_attr(&req->q.expr, &val);
   
                   else if ( ! strcmp(key, "apropos"))
                           req->q.equal = !strcmp(val, "0");
   
                   else if ( ! strcmp(key, "manpath")) {
 #ifdef COMPAT_OLDURI  #ifdef COMPAT_OLDURI
                         if (0 == strncmp(val, "OpenBSD ", 8)) {                          if ( ! strncmp(val, "OpenBSD ", 8)) {
                                 val[7] = '-';                                  val[7] = '-';
                                 if ('C' == val[8])                                  if ('C' == val[8])
                                         val[8] = 'c';                                          val[8] = 'c';
                         }                          }
 #endif  #endif
                         req->q.manpath = val;                          set_query_attr(&req->q.manpath, &val);
                 } else if (0 == strcmp(key, "apropos"))                  }
                         req->q.equal = !strcmp(val, "0");  
                 else if (0 == strcmp(key, "sec")) {                  else if ( ! (strcmp(key, "sec")
                         if (strcmp(val, "0"))  
                                 req->q.sec = val;  
 #ifdef COMPAT_OLDURI  #ifdef COMPAT_OLDURI
                 } else if (0 == strcmp(key, "sektion")) {                      && strcmp(key, "sektion")
                         if (strcmp(val, "0"))  
                                 req->q.sec = val;  
 #endif  #endif
                 } else if (0 == strcmp(key, "arch")) {                      )) {
                         if (strcmp(val, "default"))                          if ( ! strcmp(val, "0"))
                                 req->q.arch = val;                                  *val = '\0';
                           set_query_attr(&req->q.sec, &val);
                 }                  }
   
                   else if ( ! strcmp(key, "arch")) {
                           if ( ! strcmp(val, "default"))
                                   *val = '\0';
                           set_query_attr(&req->q.arch, &val);
                   }
   
                   /*
                    * The key must be freed in any case.
                    * The val may have been handed over to the query
                    * structure, in which case it is now NULL.
                    */
   next:
                   free(key);
                   key = NULL;
                   free(val);
                   val = NULL;
   
                   if (*qs != '\0')
                           qs++;
         }          }
   
           /* Fall back to the default manpath. */
   
           if (req->q.manpath == NULL)
                   req->q.manpath = mandoc_strdup(req->p[0]);
 }  }
   
 static void  static void
Line 895  pg_show(struct req *req, const char *path)
Line 944  pg_show(struct req *req, const char *path)
                 return;                  return;
         }          }
   
         if (strcmp(path, "mandoc"))          if (strcmp(path, "mandoc")) {
                 req->q.manpath = path;                  free(req->q.manpath);
                   req->q.manpath = mandoc_strdup(path);
           }
   
         resp_begin_html(200, NULL);          resp_begin_html(200, NULL);
         resp_searchform(req);          resp_searchform(req);
Line 987  main(void)
Line 1038  main(void)
 {  {
         struct req       req;          struct req       req;
         const char      *path;          const char      *path;
         char            *querystring;          const char      *querystring;
         int              i;          int              i;
   
         /* Scan our run-time environment. */          /* Scan our run-time environment. */
Line 1050  main(void)
Line 1101  main(void)
         else          else
                 pg_index(&req);                  pg_index(&req);
   
           free(req.q.manpath);
           free(req.q.arch);
           free(req.q.sec);
           free(req.q.expr);
         for (i = 0; i < (int)req.psz; i++)          for (i = 0; i < (int)req.psz; i++)
                 free(req.p[i]);                  free(req.p[i]);
         free(req.p);          free(req.p);

Legend:
Removed from v.1.82  
changed lines
  Added in v.1.83

CVSweb