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

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

version 1.83, 2014/07/25 16:07:13 version 1.85, 2014/07/25 16:56:06
Line 42  struct query {
Line 42  struct query {
         char            *manpath; /* desired manual directory */          char            *manpath; /* desired manual directory */
         char            *arch; /* architecture */          char            *arch; /* architecture */
         char            *sec; /* manual section */          char            *sec; /* manual section */
         char            *expr; /* unparsed expression string */          char            *query; /* unparsed query expression */
         int              equal; /* match whole names, not substrings */          int              equal; /* match whole names, not substrings */
 };  };
   
Line 76  static void   resp_begin_http(int, const char *);
Line 76  static void   resp_begin_http(int, const char *);
 static  void             resp_end_html(void);  static  void             resp_end_html(void);
 static  void             resp_searchform(const struct req *);  static  void             resp_searchform(const struct req *);
 static  void             resp_show(const struct req *, const char *);  static  void             resp_show(const struct req *, const char *);
   static  void             set_query_attr(char **, char **);
   static  int              validate_filename(const char *);
   static  int              validate_manpath(const struct req *, const char *);
   static  int              validate_urifrag(const char *);
   
 static  const char       *scriptname; /* CGI script name */  static  const char       *scriptname; /* CGI script name */
   
Line 156  http_printquery(const struct req *req)
Line 160  http_printquery(const struct req *req)
                 printf("&arch=");                  printf("&arch=");
                 http_print(req->q.arch);                  http_print(req->q.arch);
         }          }
         if (NULL != req->q.expr) {          if (NULL != req->q.query) {
                 printf("&query=");                  printf("&query=");
                 http_print(req->q.expr);                  http_print(req->q.query);
         }          }
         if (0 == req->q.equal)          if (0 == req->q.equal)
                 printf("&apropos=1");                  printf("&apropos=1");
Line 180  html_printquery(const struct req *req)
Line 184  html_printquery(const struct req *req)
                 printf("&arch=");                  printf("&arch=");
                 html_print(req->q.arch);                  html_print(req->q.arch);
         }          }
         if (NULL != req->q.expr) {          if (NULL != req->q.query) {
                 printf("&query=");                  printf("&query=");
                 html_print(req->q.expr);                  html_print(req->q.query);
         }          }
         if (0 == req->q.equal)          if (0 == req->q.equal)
                 printf("&apropos=1");                  printf("&apropos=1");
Line 242  http_parse(struct req *req, const char *qs)
Line 246  http_parse(struct req *req, const char *qs)
         req->q.manpath  = NULL;          req->q.manpath  = NULL;
         req->q.arch     = NULL;          req->q.arch     = NULL;
         req->q.sec      = NULL;          req->q.sec      = NULL;
         req->q.expr     = NULL;          req->q.query    = NULL;
         req->q.equal    = 1;          req->q.equal    = 1;
   
         key = val = NULL;          key = val = NULL;
Line 270  http_parse(struct req *req, const char *qs)
Line 274  http_parse(struct req *req, const char *qs)
                 /* Handle key-value pairs. */                  /* Handle key-value pairs. */
   
                 if ( ! strcmp(key, "query"))                  if ( ! strcmp(key, "query"))
                         set_query_attr(&req->q.expr, &val);                          set_query_attr(&req->q.query, &val);
   
                 else if ( ! strcmp(key, "apropos"))                  else if ( ! strcmp(key, "apropos"))
                         req->q.equal = !strcmp(val, "0");                          req->q.equal = !strcmp(val, "0");
Line 437  resp_searchform(const struct req *req)
Line 441  resp_searchform(const struct req *req)
   
         printf( "<TABLE><TR><TD>\n"          printf( "<TABLE><TR><TD>\n"
                 "<INPUT TYPE=\"text\" NAME=\"query\" VALUE=\"");                  "<INPUT TYPE=\"text\" NAME=\"query\" VALUE=\"");
         if (NULL != req->q.expr)          if (NULL != req->q.query)
                 html_print(req->q.expr);                  html_print(req->q.query);
         puts("\" SIZE=\"40\">");          puts("\" SIZE=\"40\">");
   
         /* Write submission and reset buttons. */          /* Write submission and reset buttons. */
Line 908  resp_show(const struct req *req, const char *file)
Line 912  resp_show(const struct req *req, const char *file)
 }  }
   
 static void  static void
 pg_show(struct req *req, const char *path)  pg_show(struct req *req, const char *fullpath)
 {  {
         char            *sub;          char            *manpath;
           const char      *file;
   
         if (NULL == path || NULL == (sub = strchr(path, '/'))) {          if ((file = strchr(fullpath, '/')) == NULL) {
                 pg_error_badrequest(                  pg_error_badrequest(
                     "You did not specify a page to show.");                      "You did not specify a page to show.");
                 return;                  return;
         }          }
         *sub++ = '\0';          manpath = mandoc_strndup(fullpath, file - fullpath);
           file++;
   
         if ( ! validate_manpath(req, path)) {          if ( ! validate_manpath(req, manpath)) {
                 pg_error_badrequest(                  pg_error_badrequest(
                     "You specified an invalid manpath.");                      "You specified an invalid manpath.");
                   free(manpath);
                 return;                  return;
         }          }
   
Line 931  pg_show(struct req *req, const char *path)
Line 938  pg_show(struct req *req, const char *path)
          * relative to the manpath root.           * relative to the manpath root.
          */           */
   
         if (-1 == chdir(path)) {          if (chdir(manpath) == -1) {
                 fprintf(stderr, "chdir %s: %s\n",                  fprintf(stderr, "chdir %s: %s\n",
                     path, strerror(errno));                      manpath, strerror(errno));
                 pg_error_internal();                  pg_error_internal();
                   free(manpath);
                 return;                  return;
         }          }
   
         if ( ! validate_filename(sub)) {          if (strcmp(manpath, "mandoc")) {
                   free(req->q.manpath);
                   req->q.manpath = manpath;
           } else
                   free(manpath);
   
           if ( ! validate_filename(file)) {
                 pg_error_badrequest(                  pg_error_badrequest(
                     "You specified an invalid manual file.");                      "You specified an invalid manual file.");
                 return;                  return;
         }          }
   
         if (strcmp(path, "mandoc")) {  
                 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);
         resp_show(req, sub);          resp_show(req, file);
         resp_end_html();          resp_end_html();
 }  }
   
Line 993  pg_search(const struct req *req)
Line 1002  pg_search(const struct req *req)
          * Yes, this is half-ass.  But it works for now.           * Yes, this is half-ass.  But it works for now.
          */           */
   
         ep = req->q.expr;          ep = req->q.query;
         while (ep && isspace((unsigned char)*ep))          while (ep && isspace((unsigned char)*ep))
                 ep++;                  ep++;
   
Line 1096  main(void)
Line 1105  main(void)
   
         if ('\0' != *path)          if ('\0' != *path)
                 pg_show(&req, path);                  pg_show(&req, path);
         else if (NULL != req.q.expr)          else if (NULL != req.q.query)
                 pg_search(&req);                  pg_search(&req);
         else          else
                 pg_index(&req);                  pg_index(&req);
Line 1104  main(void)
Line 1113  main(void)
         free(req.q.manpath);          free(req.q.manpath);
         free(req.q.arch);          free(req.q.arch);
         free(req.q.sec);          free(req.q.sec);
         free(req.q.expr);          free(req.q.query);
         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.83  
changed lines
  Added in v.1.85

CVSweb