[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    [PATCH 1/1] httpd_indexcgi.c and httpd_ssi.c: compile them as applets
From:       Sergey Ponomarev <stokito () gmail ! com>
Date:       2021-08-23 0:28:06
Message-ID: 20210823002806.58226-1-stokito () gmail ! com
[Download RAW message or body]

The CGI scripts can be compiled separately without a dependency to BusyBox and used \
with any other web server. But for usability we can also compile them as applets and \
thus users may see and select them in menuconfig. Also, we can install the cgi \
scripts into a known location and users may latter easily use them.

The httpd_indexcgi will be installed into /usr/bin/cgi-dirlist. The "dirlist" is \
better to understand than index which may be confusing with index.html files. The \
httpd_ssi is in fact not a CGI script but an Interpreter. It will be installed to \
/usr/bin/ssi. The ssi name is not used by any other linux tool.

We also can reuse some functions from libbb. E.g. httpd_ssi.c may reuse \
skip_whitespace(). It works similarly except that it also skips newlines \n\r.
This difference is not important because the include_directive anyway is already a \
line, so it doesn't contain any newline symbol.

Signed-off-by: Sergey Ponomarev <stokito@gmail.com>
---
 networking/httpd_indexcgi.c | 36 +++++++++++++++++++++++++++--
 networking/httpd_ssi.c      | 46 +++++++++++++++++++++++++++++++------
 2 files changed, 73 insertions(+), 9 deletions(-)

diff --git a/networking/httpd_indexcgi.c b/networking/httpd_indexcgi.c
index 47b1159f4..53d316d05 100644
--- a/networking/httpd_indexcgi.c
+++ b/networking/httpd_indexcgi.c
@@ -6,10 +6,31 @@
 
 /*
  * This program is a CGI application. It outputs directory index page.
- * Put it into cgi-bin/index.cgi and chmod 0755.
+ * For BusyBox httpd put the program into cgi-bin/index.cgi and chmod 0755.
+ * 
+ * The BusyBox httpd must be compiled with FEATURE_HTTPD_CGI=y
+ * 
+ * It can be built as a standalone program or as part of busybox itself
  */
 
-/* Build a-la
+//config:config CGI_DIRLIST
+//config:	bool "CGI dirlist"
+//config:	default n
+//config:	help
+//config:	 GGI script to generate directory list index i.e. table of files.
+//config:	 To use it link the cgi-dirlist binary to a target folder's cgi-bin e.g.:
+//config:	   ln /usr/bin/cgi-dirlist  /srv/www/cgi-bin/index.cgi
+//config:	 When open in browser you'll see list of files in the /srv/www/ directory
+
+//kbuild:lib-$(CONFIG_CGI_DIRLIST) += httpd_indexcgi.o
+//applet:IF_CGI_DIRLIST(APPLET_ODDNAME(cgi-dirlist, cgi_dirlist, BB_DIR_USR_BIN, \
BB_SUID_DROP, cgi_dirlist)) +
+//usage:#define cgi_dirlist_trivial_usage
+//usage:	"REQUEST_URI=/ cgi_dirlist"
+//usage:#define cgi_dirlist_full_usage "\n\n"
+//usage:       "Generate an HTML with files from requested directory\n"
+
+/* Build it as a standalone program a-la
 i486-linux-uclibc-gcc \
 -static -static-libgcc \
 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \
@@ -36,6 +57,10 @@ httpd_indexcgi.c -o index.cgi
  */
 
 #define _GNU_SOURCE 1  /* for strchrnul */
+/* If building as applet */
+#if ENABLE_CGI_DIRLIST
+ #include "libbb.h"
+#endif
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <errno.h>
@@ -211,7 +236,14 @@ static void fmt_04u(/*char *dst,*/ unsigned n)
 	fmt_02u(n % 100);
 }
 
+/* If building as applet */
+#if ENABLE_CGI_DIRLIST
+int cgi_dirlist_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int cgi_dirlist_main(int argc UNUSED_PARAM, char **argv)
+#else
+/* standalone */
 int main(int argc, char *argv[])
+#endif
 {
 	dir_list_t *dir_list;
 	dir_list_t *cdir;
diff --git a/networking/httpd_ssi.c b/networking/httpd_ssi.c
index 4bd9a6d97..a14a09bbb 100644
--- a/networking/httpd_ssi.c
+++ b/networking/httpd_ssi.c
@@ -5,16 +5,36 @@
  */
 
 /*
- * This program is a CGI application. It processes server-side includes:
+ * This program is a HTTPD interpreter. It processes server-side includes:
  * <!--#include file="file.html" -->
  *
- * Usage: put these lines in httpd.conf:
+ * Usage: For BusyBox httpd put these lines in httpd.conf:
  *
- * *.html:/bin/httpd_ssi
- * *.htm:/bin/httpd_ssi
+ * *.shtml:/usr/bin/ssi
+ * 
+ * The BusyBox httpd must be compiled with \
FEATURE_HTTPD_CONFIG_WITH_SCRIPT_INTERPR=y + * 
+ * It can be built as a standalone program or as part of busybox itself
  */
 
-/* Build a-la
+//config:config SSI
+//config:	bool "Server-Side Includes (SSI) interpreter"
+//config:	default n
+//config:	help
+//config:	 Tool to generate a single HTML from several files.
+//config:	 E.g. you have a template index.shtml and it's body starting with
+//config:	  <!--#include file="header.html" -->
+//config:	 SSI interpreter will replace the directive with raw text from header.html
+
+//kbuild:lib-$(CONFIG_SSI) += httpd_ssi.o
+//applet:IF_SSI(APPLET(ssi, BB_DIR_USR_BIN, BB_SUID_DROP))
+
+//usage:#define ssi_trivial_usage
+//usage:	"ssi /index.shtml"
+//usage:#define ssi_full_usage "\n\n"
+//usage:       "Generate an HTML from template with SSI\n"
+
+/* Build it as a standalone program a-la
 i486-linux-uclibc-gcc \
 -static -static-libgcc \
 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 \
@@ -27,7 +47,7 @@ i486-linux-uclibc-gcc \
 -falign-functions=1 -falign-jumps=1 -falign-labels=1 -falign-loops=1 \
 -march=i386 -mpreferred-stack-boundary=2 \
 -Wl,-Map -Wl,link.map -Wl,--warn-common -Wl,--sort-common -Wl,--gc-sections \
-httpd_ssi.c -o httpd_ssi
+httpd_ssi.c -o ssi
 */
 
 /* Size (i386, static uclibc, approximate):
@@ -37,7 +57,10 @@ httpd_ssi.c -o httpd_ssi
  * Note: it wouldn't be too hard to get rid of stdio and strdup,
  * (especially that fgets() mangles NULs...)
  */
-
+/* If building as applet */
+#if ENABLE_SSI
+ #include "libbb.h"
+#endif
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <errno.h>
@@ -50,12 +73,14 @@ httpd_ssi.c -o httpd_ssi
 #include <dirent.h>
 #include <time.h>
 
+#if !ENABLE_SSI
 static char* skip_whitespace(char *s)
 {
 	while (*s == ' ' || *s == '\t') ++s;
 
 	return s;
 }
+#endif
 
 static char line[64 * 1024];
 
@@ -143,7 +168,14 @@ static void process_includes(const char *filename)
 	fclose(fp);
 }
 
+/* If building as applet */
+#if ENABLE_SSI
+int ssi_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int ssi_main(int argc UNUSED_PARAM, char **argv)
+#else
+/* standalone */
 int main(int argc, char *argv[])
+#endif
 {
 	if (!argv[1])
 		return 1;
-- 
2.30.2

_______________________________________________
busybox mailing list
busybox@busybox.net
http://lists.busybox.net/mailman/listinfo/busybox


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic