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

Diff for /mandoc/cgi.c between version 1.9 and 1.10

version 1.9, 2011/12/04 22:52:50 version 1.10, 2011/12/07 00:23:04
Line 69  static int   atou(const char *, unsigned *);
Line 69  static int   atou(const char *, unsigned *);
 static  void             catman(const char *);  static  void             catman(const char *);
 static  void             format(const char *);  static  void             format(const char *);
 static  void             html_print(const char *);  static  void             html_print(const char *);
   static  void             html_putchar(char);
 static  int              kval_decode(char *);  static  int              kval_decode(char *);
 static  void             kval_parse(struct kval **, size_t *, char *);  static  void             kval_parse(struct kval **, size_t *, char *);
 static  void             kval_free(struct kval *, size_t);  static  void             kval_free(struct kval *, size_t);
Line 80  static void   pg_show(const struct manpaths *,
Line 81  static void   pg_show(const struct manpaths *,
                                 const struct req *, char *);                                  const struct req *, char *);
 static  void             resp_bad(void);  static  void             resp_bad(void);
 static  void             resp_baddb(void);  static  void             resp_baddb(void);
 static  void             resp_badexpr(const struct req *);  static  void             resp_error400(void);
 static  void             resp_badmanual(void);  static  void             resp_error404(const char *);
 static  void             resp_badpage(void);  
 static  void             resp_begin_html(int, const char *);  static  void             resp_begin_html(int, const char *);
 static  void             resp_begin_http(int, const char *);  static  void             resp_begin_http(int, const char *);
 static  void             resp_end_html(void);  static  void             resp_end_html(void);
Line 123  atou(const char *buf, unsigned *v)
Line 123  atou(const char *buf, unsigned *v)
         return(1);          return(1);
 }  }
   
   static void
   html_putchar(char c)
   {
   
           switch (c) {
           case ('"'):
                   printf("&quote;");
                   break;
           case ('&'):
                   printf("&");
                   break;
           case ('>'):
                   printf(">");
                   break;
           case ('<'):
                   printf("&lt;");
                   break;
           default:
                   putchar((unsigned char)c);
                   break;
           }
   }
   
 /*  /*
  * Print a word, escaping HTML along the way.   * Print a word, escaping HTML along the way.
  * This will pass non-ASCII straight to output: be warned!   * This will pass non-ASCII straight to output: be warned!
Line 130  atou(const char *buf, unsigned *v)
Line 153  atou(const char *buf, unsigned *v)
 static void  static void
 html_print(const char *p)  html_print(const char *p)
 {  {
         char             c;  
   
         if (NULL == p)          if (NULL == p)
                 return;                  return;
   
         while ('\0' != *p)          while ('\0' != *p)
                 switch ((c = *p++)) {                  html_putchar(*p++);
                 case ('"'):  
                         printf("&quote;");  
                         break;  
                 case ('&'):  
                         printf("&amp;");  
                         break;  
                 case ('>'):  
                         printf("&gt;");  
                         break;  
                 case ('<'):  
                         printf("&lt;");  
                         break;  
                 default:  
                         putchar((unsigned char)c);  
                         break;  
                 }  
 }  }
   
 static void  static void
Line 290  resp_begin_html(int code, const char *msg)
Line 295  resp_begin_html(int code, const char *msg)
              " \"http://www.w3.org/TR/html4/strict.dtd\">"      "\n"               " \"http://www.w3.org/TR/html4/strict.dtd\">"      "\n"
              "<HTML>"                                           "\n"               "<HTML>"                                           "\n"
              " <HEAD>"                                          "\n"               " <HEAD>"                                          "\n"
                "   <META HTTP-EQUIV=\"Content-Type\" "            "\n"
                "         CONTENT=\"text/html; charset=utf-8\">"   "\n"
              "  <TITLE>System Manpage Reference</TITLE>"        "\n"               "  <TITLE>System Manpage Reference</TITLE>"        "\n"
              " </HEAD>"                                         "\n"               " </HEAD>"                                         "\n"
              " <BODY>"                                          "\n"               " <BODY>"                                          "\n"
Line 323  resp_searchform(const struct req *req)
Line 330  resp_searchform(const struct req *req)
         printf("<FORM ACTION=\"");          printf("<FORM ACTION=\"");
         html_print(progname);          html_print(progname);
         printf("/search.html\" METHOD=\"get\">\n");          printf("/search.html\" METHOD=\"get\">\n");
         puts(" <FIELDSET>"                                      "\n"          puts(" <FIELDSET>\n"
              "  <INPUT TYPE=\"submit\" VALUE=\"Search:\">");               "  <INPUT TYPE=\"submit\" VALUE=\"Search:\">");
         printf("  Terms: <INPUT TYPE=\"text\" "          printf("  Terms: <INPUT TYPE=\"text\" "
                         "SIZE=\"60\" NAME=\"expr\" VALUE=\"");                          "SIZE=\"60\" NAME=\"expr\" VALUE=\"");
Line 350  resp_index(const struct req *req)
Line 357  resp_index(const struct req *req)
 }  }
   
 static void  static void
 resp_badpage(void)  resp_error400(void)
 {  {
   
         resp_begin_html(404, "Not Found");          resp_begin_html(400, "Query Malformed");
         puts("<P>Page not found.</P>");          puts("<H1>Malformed Query</H1>\n"
                "<P>\n"
                "  The query your entered was malformed.\n"
                "  Try again from the\n"
                "  <A HREF=\"/index.html\">main page</A>\n"
                "</P>");
         resp_end_html();          resp_end_html();
 }  }
   
 static void  static void
 resp_badmanual(void)  resp_error404(const char *page)
 {  {
   
         resp_begin_html(404, "Not Found");          resp_begin_html(404, "Not Found");
         puts("<P>Requested manual not found.</P>");          puts("<H1>Page Not Found</H1>\n"
                "<P>\n"
                "  The page you're looking for, ");
           printf("  <B>");
           html_print(page);
           puts("</B>,\n"
                "  could not be found.\n"
                "  Try searching from the\n"
                "  <A HREF=\"/index.html\">main page</A>\n"
                "</P>");
         resp_end_html();          resp_end_html();
 }  }
   
 static void  static void
 resp_badexpr(const struct req *req)  
 {  
   
         resp_begin_html(200, NULL);  
         resp_searchform(req);  
         puts("<P>Your search didn't work.</P>");  
         resp_end_html();  
 }  
   
 static void  
 resp_bad(void)  resp_bad(void)
 {  {
         resp_begin_html(500, "Internal Server Error");          resp_begin_html(500, "Internal Server Error");
Line 448  pg_index(const struct manpaths *ps, const struct req *
Line 459  pg_index(const struct manpaths *ps, const struct req *
 static void  static void
 catman(const char *file)  catman(const char *file)
 {  {
         int              fd;          FILE            *f;
         char             buf[BUFSIZ];          size_t           len;
         ssize_t          ssz;          int              i;
           char            *p;
           int              italic, bold;
   
         if (-1 == (fd = open(file, O_RDONLY, 0))) {          if (NULL == (f = fopen(file, "r"))) {
                 resp_baddb();                  resp_baddb();
                 return;                  return;
         }          }
   
         resp_begin_http(200, NULL);          resp_begin_html(200, NULL);
   
         while ((ssz = read(fd, buf, BUFSIZ)) > 0)          puts("<PRE>");
                 write(STDOUT_FILENO, buf, (size_t)ssz);          while (NULL != (p = fgetln(f, &len))) {
                   bold = italic = 0;
                   for (i = 0; i < (int)len - 1; i++) {
                           /*
                            * This means that the catpage is out of state.
                            * Ignore it and keep going (although the
                            * catpage is bogus).
                            */
   
         if (ssz < 0)                          if ('\b' == p[i] || '\n' == p[i])
                 perror(file);                                  continue;
   
         close(fd);                          /*
                            * Print a regular character.
                            * Close out any bold/italic scopes.
                            * If we're in back-space mode, make sure we'll
                            * have something to enter when we backspace.
                            */
   
                           if ('\b' != p[i + 1]) {
                                   if (italic)
                                           printf("</I>");
                                   if (bold)
                                           printf("</B>");
                                   italic = bold = 0;
                                   html_putchar(p[i]);
                                   continue;
                           } else if (i + 2 >= (int)len)
                                   continue;
   
                           /* Italic mode. */
   
                           if ('_' == p[i]) {
                                   if (bold)
                                           printf("</B>");
                                   if ( ! italic)
                                           printf("<I>");
                                   bold = 0;
                                   italic = 1;
                                   i += 2;
                                   html_putchar(p[i]);
                                   continue;
                           }
   
                           /*
                            * Handle funny behaviour troff-isms.
                            * These grok'd from the original man2html.c.
                            */
   
                           if (('+' == p[i] && 'o' == p[i + 2]) ||
                                           ('o' == p[i] && '+' == p[i + 2]) ||
                                           ('|' == p[i] && '=' == p[i + 2]) ||
                                           ('=' == p[i] && '|' == p[i + 2]) ||
                                           ('*' == p[i] && '=' == p[i + 2]) ||
                                           ('=' == p[i] && '*' == p[i + 2]) ||
                                           ('*' == p[i] && '|' == p[i + 2]) ||
                                           ('|' == p[i] && '*' == p[i + 2]))  {
                                   if (italic)
                                           printf("</I>");
                                   if (bold)
                                           printf("</B>");
                                   italic = bold = 0;
                                   putchar('*');
                                   i += 2;
                                   continue;
                           } else if (('|' == p[i] && '-' == p[i + 2]) ||
                                           ('-' == p[i] && '|' == p[i + 1]) ||
                                           ('+' == p[i] && '-' == p[i + 1]) ||
                                           ('-' == p[i] && '+' == p[i + 1]) ||
                                           ('+' == p[i] && '|' == p[i + 1]) ||
                                           ('|' == p[i] && '+' == p[i + 1]))  {
                                   if (italic)
                                           printf("</I>");
                                   if (bold)
                                           printf("</B>");
                                   italic = bold = 0;
                                   putchar('+');
                                   i += 2;
                                   continue;
                           }
   
                           /* Bold mode. */
   
                           if (italic)
                                   printf("</I>");
                           if ( ! bold)
                                   printf("<B>");
                           bold = 1;
                           italic = 0;
                           i += 2;
                           html_putchar(p[i]);
                   }
   
                   /*
                    * Clean up the last character.
                    * We can get to a newline; don't print that.
                    */
   
                   if (italic)
                           printf("</I>");
                   if (bold)
                           printf("</B>");
   
                   if (i == (int)len - 1 && '\n' != p[i])
                           html_putchar(p[i]);
   
                   putchar('\n');
           }
   
           puts("</PRE>\n"
                "</BODY>\n"
                "</HTML>");
   
           fclose(f);
 }  }
   
 static void  static void
Line 477  format(const char *file)
Line 598  format(const char *file)
         struct man      *man;          struct man      *man;
         void            *vp;          void            *vp;
         enum mandoclevel rc;          enum mandoclevel rc;
           char             opts[MAXPATHLEN + 128];
   
         if (-1 == (fd = open(file, O_RDONLY, 0))) {          if (-1 == (fd = open(file, O_RDONLY, 0))) {
                 resp_baddb();                  resp_baddb();
Line 492  format(const char *file)
Line 614  format(const char *file)
                 return;                  return;
         }          }
   
           snprintf(opts, sizeof(opts), "style=/style.css,"
                           "man=%s/search.html?sec=%%S&expr=%%N,"
                           "includes=/cgi-bin/man.cgi/usr/include/%%I",
                           progname);
   
         mparse_result(mp, &mdoc, &man);          mparse_result(mp, &mdoc, &man);
         vp = html_alloc(NULL);          vp = html_alloc(opts);
   
         if (NULL != mdoc) {          if (NULL != mdoc) {
                 resp_begin_http(200, NULL);                  resp_begin_http(200, NULL);
Line 520  pg_show(const struct manpaths *ps, const struct req *r
Line 647  pg_show(const struct manpaths *ps, const struct req *r
         DBT              key, val;          DBT              key, val;
   
         if (NULL == path) {          if (NULL == path) {
                 resp_badmanual();                  resp_error400();
                 return;                  return;
         } else if (NULL == (sub = strrchr(path, '/'))) {          } else if (NULL == (sub = strrchr(path, '/'))) {
                 resp_badmanual();                  resp_error400();
                 return;                  return;
         } else          } else
                 *sub++ = '\0';                  *sub++ = '\0';
   
         if ( ! (atou(path, &vol) && atou(sub, &rec))) {          if ( ! (atou(path, &vol) && atou(sub, &rec))) {
                 resp_badmanual();                  resp_error400();
                 return;                  return;
         } else if (vol >= (unsigned int)ps->sz) {          } else if (vol >= (unsigned int)ps->sz) {
                 resp_badmanual();                  resp_error400();
                 return;                  return;
         }          }
   
Line 551  pg_show(const struct manpaths *ps, const struct req *r
Line 678  pg_show(const struct manpaths *ps, const struct req *r
         key.size = 4;          key.size = 4;
   
         if (0 != (rc = (*idx->get)(idx, &key, &val, 0))) {          if (0 != (rc = (*idx->get)(idx, &key, &val, 0))) {
                 rc < 0 ? resp_baddb() : resp_badmanual();                  rc < 0 ? resp_baddb() : resp_error400();
                 goto out;                  goto out;
         }          }
   
Line 639  pg_search(const struct manpaths *ps, const struct req 
Line 766  pg_search(const struct manpaths *ps, const struct req 
         if (0 == rc)          if (0 == rc)
                 resp_baddb();                  resp_baddb();
         else if (-1 == rc)          else if (-1 == rc)
                 resp_badexpr(req);                  resp_search(NULL, 0, (void *)req);
   
         for (i = 0; i < sz; i++)          for (i = 0; i < sz; i++)
                 free(cp[i]);                  free(cp[i]);
Line 729  main(void)
Line 856  main(void)
                 pg_show(&paths, &req, subpath);                  pg_show(&paths, &req, subpath);
                 break;                  break;
         default:          default:
                 resp_badpage();                  resp_error404(path);
                 break;                  break;
         }          }
   

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.10

CVSweb