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

Diff for /mandoc/cgi.c between version 1.144 and 1.149

version 1.144, 2017/01/21 01:20:31 version 1.149, 2017/03/15 10:17:29
Line 21 
Line 21 
 #include <sys/time.h>  #include <sys/time.h>
   
 #include <ctype.h>  #include <ctype.h>
   #if HAVE_ERR
 #include <err.h>  #include <err.h>
   #endif
 #include <errno.h>  #include <errno.h>
 #include <fcntl.h>  #include <fcntl.h>
 #include <limits.h>  #include <limits.h>
Line 74  static void   pg_error_badrequest(const char *);
Line 76  static void   pg_error_badrequest(const char *);
 static  void             pg_error_internal(void);  static  void             pg_error_internal(void);
 static  void             pg_index(const struct req *);  static  void             pg_index(const struct req *);
 static  void             pg_noresult(const struct req *, const char *);  static  void             pg_noresult(const struct req *, const char *);
   static  void             pg_redirect(const struct req *, const char *);
 static  void             pg_search(const struct req *);  static  void             pg_search(const struct req *);
 static  void             pg_searchres(const struct req *,  static  void             pg_searchres(const struct req *,
                                 struct manpage *, size_t);                                  struct manpage *, size_t);
Line 113  static const char *const sec_names[] = {
Line 116  static const char *const sec_names[] = {
 static  const int sec_MAX = sizeof(sec_names) / sizeof(char *);  static  const int sec_MAX = sizeof(sec_names) / sizeof(char *);
   
 static  const char *const arch_names[] = {  static  const char *const arch_names[] = {
     "amd64",       "alpha",       "armv7",      "amd64",       "alpha",       "armv7",      "arm64",
     "hppa",        "i386",        "landisk",      "hppa",        "i386",        "landisk",
     "loongson",    "luna88k",     "macppc",      "mips64",      "loongson",    "luna88k",     "macppc",      "mips64",
     "octeon",      "sgi",         "socppc",      "sparc64",      "octeon",      "sgi",         "socppc",      "sparc64",
Line 538  pg_error_internal(void)
Line 541  pg_error_internal(void)
 }  }
   
 static void  static void
   pg_redirect(const struct req *req, const char *name)
   {
           printf("Status: 303 See Other\r\n");
           printf("Location: http://%s/", HTTP_HOST);
           if (*scriptname != '\0')
                   printf("%s/", scriptname);
           if (strcmp(req->q.manpath, req->p[0]))
                   printf("%s/", req->q.manpath);
           if (req->q.arch != NULL)
                   printf("%s/", req->q.arch);
           printf("%s", name);
           if (req->q.sec != NULL)
                   printf(".%s", req->q.sec);
           printf("\r\nContent-Type: text/html; charset=utf-8\r\n\r\n");
   }
   
   static void
 pg_searchres(const struct req *req, struct manpage *r, size_t sz)  pg_searchres(const struct req *req, struct manpage *r, size_t sz)
 {  {
         char            *arch, *archend;          char            *arch, *archend;
Line 799  resp_format(const struct req *req, const char *file)
Line 819  resp_format(const struct req *req, const char *file)
   
         memset(&conf, 0, sizeof(conf));          memset(&conf, 0, sizeof(conf));
         conf.fragment = 1;          conf.fragment = 1;
           conf.style = mandoc_strdup(CSS_DIR "/mandoc.css");
         usepath = strcmp(req->q.manpath, req->p[0]);          usepath = strcmp(req->q.manpath, req->p[0]);
         mandoc_asprintf(&conf.man, "/%s%s%%N.%%S",          mandoc_asprintf(&conf.man, "/%s%s%%N.%%S",
             usepath ? req->q.manpath : "", usepath ? "/" : "");              usepath ? req->q.manpath : "", usepath ? "/" : "");
Line 826  resp_format(const struct req *req, const char *file)
Line 847  resp_format(const struct req *req, const char *file)
         mparse_free(mp);          mparse_free(mp);
         mchars_free();          mchars_free();
         free(conf.man);          free(conf.man);
           free(conf.style);
 }  }
   
 static void  static void
Line 952  pg_search(const struct req *req)
Line 974  pg_search(const struct req *req)
                 }                  }
         }          }
   
         if (0 == mansearch(&search, &paths, argc, argv, &res, &ressz))          res = NULL;
           ressz = 0;
           if (req->isquery && req->q.equal && argc == 1)
                   pg_redirect(req, argv[0]);
           else if (mansearch(&search, &paths, argc, argv, &res, &ressz) == 0)
                 pg_noresult(req, "You entered an invalid query.");                  pg_noresult(req, "You entered an invalid query.");
         else if (0 == ressz)          else if (ressz == 0)
                 pg_noresult(req, "No results found.");                  pg_noresult(req, "No results found.");
         else          else
                 pg_searchres(req, res, ressz);                  pg_searchres(req, res, ressz);
Line 973  main(void)
Line 999  main(void)
         const char      *path;          const char      *path;
         const char      *querystring;          const char      *querystring;
         int              i;          int              i;
   
   #if HAVE_PLEDGE
           /*
            * The "rpath" pledge could be revoked after mparse_readfd()
            * if the file desciptor to "/footer.html" would be opened
            * up front, but it's probably not worth the complication
            * of the code it would cause: it would require scattering
            * pledge() calls in multiple low-level resp_*() functions.
            */
   
           if (pledge("stdio rpath", NULL) == -1) {
                   warn("pledge");
                   pg_error_internal();
                   return EXIT_FAILURE;
           }
   #endif
   
         /* Poor man's ReDoS mitigation. */          /* Poor man's ReDoS mitigation. */
   

Legend:
Removed from v.1.144  
changed lines
  Added in v.1.149

CVSweb