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

Diff for /mandoc/cgi.c between version 1.88 and 1.92

version 1.88, 2014/07/25 18:20:39 version 1.92, 2014/08/05 15:29:30
Line 23 
Line 23 
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <limits.h>  #include <limits.h>
   #include <stdint.h>
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <string.h>  #include <string.h>
Line 55  struct req {
Line 56  struct req {
 static  void             catman(const struct req *, const char *);  static  void             catman(const struct req *, const char *);
 static  void             format(const struct req *, const char *);  static  void             format(const struct req *, const char *);
 static  void             html_print(const char *);  static  void             html_print(const char *);
 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 *, const 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 *, const char *);
 static  void             pathgen(struct req *);  static  void             pathgen(struct req *);
 static  void             pg_error_badrequest(const char *);  static  void             pg_error_badrequest(const char *);
 static  void             pg_error_internal(void);  static  void             pg_error_internal(void);
Line 145  html_putchar(char c)
Line 145  html_putchar(char c)
 }  }
   
 static void  static void
 http_printquery(const struct req *req)  http_printquery(const struct req *req, const char *sep)
 {  {
   
         if (NULL != req->q.query) {          if (NULL != req->q.query) {
Line 153  http_printquery(const struct req *req)
Line 153  http_printquery(const struct req *req)
                 http_print(req->q.query);                  http_print(req->q.query);
         }          }
         if (0 == req->q.equal)          if (0 == req->q.equal)
                 printf("&apropos=1");                  printf("%sapropos=1", sep);
         if (NULL != req->q.sec) {          if (NULL != req->q.sec) {
                 printf("&sec=");                  printf("%ssec=", sep);
                 http_print(req->q.sec);                  http_print(req->q.sec);
         }          }
         if (NULL != req->q.arch) {          if (NULL != req->q.arch) {
                 printf("&arch=");                  printf("%sarch=", sep);
                 http_print(req->q.arch);                  http_print(req->q.arch);
         }          }
         if (NULL != req->q.manpath &&          if (NULL != req->q.manpath &&
             strcmp(req->q.manpath, req->p[0])) {              strcmp(req->q.manpath, req->p[0])) {
                 printf("&manpath=");                  printf("%smanpath=", sep);
                 http_print(req->q.manpath);                  http_print(req->q.manpath);
         }          }
 }  }
   
 static void  static void
 html_printquery(const struct req *req)  
 {  
   
         if (NULL != req->q.query) {  
                 printf("query=");  
                 html_print(req->q.query);  
         }  
         if (0 == req->q.equal)  
                 printf("&amp;apropos=1");  
         if (NULL != req->q.sec) {  
                 printf("&amp;sec=");  
                 html_print(req->q.sec);  
         }  
         if (NULL != req->q.arch) {  
                 printf("&amp;arch=");  
                 html_print(req->q.arch);  
         }  
         if (NULL != req->q.manpath &&  
             strcmp(req->q.manpath, req->p[0])) {  
                 printf("&amp;manpath=");  
                 html_print(req->q.manpath);  
         }  
 }  
   
 static void  
 http_print(const char *p)  http_print(const char *p)
 {  {
   
Line 640  pg_searchres(const struct req *req, struct manpage *r,
Line 615  pg_searchres(const struct req *req, struct manpage *r,
                 printf("Status: 303 See Other\r\n");                  printf("Status: 303 See Other\r\n");
                 printf("Location: http://%s%s/%s/%s?",                  printf("Location: http://%s%s/%s/%s?",
                     HTTP_HOST, scriptname, req->q.manpath, r[0].file);                      HTTP_HOST, scriptname, req->q.manpath, r[0].file);
                 http_printquery(req);                  http_printquery(req, "&");
                 printf("\r\n"                  printf("\r\n"
                      "Content-Type: text/html; charset=utf-8\r\n"                       "Content-Type: text/html; charset=utf-8\r\n"
                      "\r\n");                       "\r\n");
Line 657  pg_searchres(const struct req *req, struct manpage *r,
Line 632  pg_searchres(const struct req *req, struct manpage *r,
                        "<TD CLASS=\"title\">\n"                         "<TD CLASS=\"title\">\n"
                        "<A HREF=\"%s/%s/%s?",                         "<A HREF=\"%s/%s/%s?",
                     scriptname, req->q.manpath, r[i].file);                      scriptname, req->q.manpath, r[i].file);
                 html_printquery(req);                  http_printquery(req, "&amp;");
                 printf("\">");                  printf("\">");
                 html_print(r[i].names);                  html_print(r[i].names);
                 printf("</A>\n"                  printf("</A>\n"
Line 851  static void
Line 826  static void
 format(const struct req *req, const char *file)  format(const struct req *req, const char *file)
 {  {
         struct mparse   *mp;          struct mparse   *mp;
         int              fd;  
         struct mdoc     *mdoc;          struct mdoc     *mdoc;
         struct man      *man;          struct man      *man;
         void            *vp;          void            *vp;
           char            *opts;
         enum mandoclevel rc;          enum mandoclevel rc;
         char             opts[PATH_MAX + 128];          int              fd;
           int              usepath;
   
         if (-1 == (fd = open(file, O_RDONLY, 0))) {          if (-1 == (fd = open(file, O_RDONLY, 0))) {
                 puts("<P>You specified an invalid manual file.</P>");                  puts("<P>You specified an invalid manual file.</P>");
Line 875  format(const struct req *req, const char *file)
Line 851  format(const struct req *req, const char *file)
                 return;                  return;
         }          }
   
         snprintf(opts, sizeof(opts), "fragment,man=%s?"          usepath = strcmp(req->q.manpath, req->p[0]);
             "manpath=%s&query=%%N&sec=%%S%s%s",          mandoc_asprintf(&opts,
             scriptname, req->q.manpath,              "fragment,man=%s?query=%%N&sec=%%S%s%s%s%s",
             req->q.arch ? "&arch=" : "",              scriptname,
             req->q.arch ? req->q.arch : "");              req->q.arch ? "&arch="       : "",
               req->q.arch ? req->q.arch    : "",
               usepath     ? "&manpath="    : "",
               usepath     ? req->q.manpath : "");
   
         mparse_result(mp, &mdoc, &man, NULL);          mparse_result(mp, &mdoc, &man, NULL);
         if (NULL == man && NULL == mdoc) {          if (NULL == man && NULL == mdoc) {
Line 899  format(const struct req *req, const char *file)
Line 878  format(const struct req *req, const char *file)
   
         html_free(vp);          html_free(vp);
         mparse_free(mp);          mparse_free(mp);
           free(opts);
 }  }
   
 static void  static void
Line 1086  main(void)
Line 1066  main(void)
         if (NULL != (querystring = getenv("QUERY_STRING")))          if (NULL != (querystring = getenv("QUERY_STRING")))
                 http_parse(&req, querystring);                  http_parse(&req, querystring);
   
         if ( ! validate_manpath(&req, req.q.manpath)) {          if ( ! (NULL == req.q.manpath ||
               validate_manpath(&req, req.q.manpath))) {
                 pg_error_badrequest(                  pg_error_badrequest(
                     "You specified an invalid manpath.");                      "You specified an invalid manpath.");
                 return(EXIT_FAILURE);                  return(EXIT_FAILURE);

Legend:
Removed from v.1.88  
changed lines
  Added in v.1.92

CVSweb