diff options
-rw-r--r-- | Makefile | 5 | ||||
-rw-r--r-- | README.md | 3 | ||||
-rw-r--r-- | cgi.c | 23 | ||||
-rw-r--r-- | default.css | 80 | ||||
-rw-r--r-- | index.html | 51 | ||||
-rw-r--r-- | letter.html | 24 | ||||
-rw-r--r-- | main.c | 35 |
7 files changed, 171 insertions, 50 deletions
@@ -4,7 +4,7 @@ cflags.debug := -Wall -o0 -g -DDEBUG=1 | |||
4 | cflags.release := -os -s | 4 | cflags.release := -os -s |
5 | CFLAGS := ${cflags.${BUILD}} | 5 | CFLAGS := ${cflags.${BUILD}} |
6 | 6 | ||
7 | LIBS := -lcups | 7 | LIBS := -lcups -lmagic |
8 | 8 | ||
9 | CFLAGS += -L/usr/local/lib | 9 | CFLAGS += -L/usr/local/lib |
10 | CFLAGS += -I/usr/local/include | 10 | CFLAGS += -I/usr/local/include |
@@ -14,6 +14,9 @@ FILES := cgi.c http_parser.c | |||
14 | test: main | 14 | test: main |
15 | ./main.${BUILD} | 15 | ./main.${BUILD} |
16 | 16 | ||
17 | test_param: main | ||
18 | ./main.${BUILD} --test1 -a -b -c --test2 --pidfile=foo --pidfile foobar | ||
19 | |||
17 | main: clean | 20 | main: clean |
18 | $(CC) $(CFLAGS) -o $@.${BUILD} $(FILES) main.c $(LIBS) | 21 | $(CC) $(CFLAGS) -o $@.${BUILD} $(FILES) main.c $(LIBS) |
19 | 22 | ||
diff --git a/README.md b/README.md new file mode 100644 index 0000000..0f7b2aa --- /dev/null +++ b/README.md | |||
@@ -0,0 +1,3 @@ | |||
1 | ohmycgi 😇 - the missing piece | ||
2 | |||
3 | |||
@@ -37,9 +37,11 @@ | |||
37 | 37 | ||
38 | #include "main.h" | 38 | #include "main.h" |
39 | #include <cups/cups.h> | 39 | #include <cups/cups.h> |
40 | #include <magic.h> | ||
40 | 41 | ||
41 | static const char * line1 = NULL, * line2 = NULL; | 42 | static const char * line1 = NULL, * line2 = NULL; |
42 | 43 | ||
44 | |||
43 | int print_on_correct_printer(void * user_data, unsigned flags, cups_dest_t * dest) { | 45 | int print_on_correct_printer(void * user_data, unsigned flags, cups_dest_t * dest) { |
44 | if(!strstr(dest->name, user_data)) { | 46 | if(!strstr(dest->name, user_data)) { |
45 | // DEBUG("> Wrong printer name: '%s'; try next printer...\n", dest->name); | 47 | // DEBUG("> Wrong printer name: '%s'; try next printer...\n", dest->name); |
@@ -89,7 +91,26 @@ int print_on_correct_printer(void * user_data, unsigned flags, cups_dest_t * des | |||
89 | 91 | ||
90 | void send_answer_file(Http_Header * http_header, FILE * f) { | 92 | void send_answer_file(Http_Header * http_header, FILE * f) { |
91 | fputs("HTTP/1.0 200 OK\n", f); | 93 | fputs("HTTP/1.0 200 OK\n", f); |
92 | fputs("content-type: text/html\n\n", f); | 94 | |
95 | DEBUG("> PROBLEM: %s\n", &http_header->url[strlen(http_header->url) - 4]); | ||
96 | if(0 == strncmp(&http_header->url[strlen(http_header->url) - 4], ".css", 4)) { | ||
97 | fputs("content-type: text/css", f); | ||
98 | } else { | ||
99 | |||
100 | magic_t magic = magic_open(MAGIC_MIME); | ||
101 | |||
102 | magic_load(magic, NULL); | ||
103 | // magic_compile(magic, NULL); | ||
104 | const char * mime_type = magic_file(magic, &http_header->url[1]); | ||
105 | if(mime_type) | ||
106 | fprintf(f, "content-type: %s\n\n", mime_type); | ||
107 | else | ||
108 | fputs("content-type: text/html; charset=utf-8", f); | ||
109 | // fprintf(f, "content-type: %s; charset=utf-8\n\n", magic_file(magic, &http_header->url[1])); | ||
110 | magic_close(magic); | ||
111 | } | ||
112 | |||
113 | fputs("\n\n", f); | ||
93 | fflush(f); | 114 | fflush(f); |
94 | 115 | ||
95 | #define BUFFER_SIZE 1024 | 116 | #define BUFFER_SIZE 1024 |
diff --git a/default.css b/default.css new file mode 100644 index 0000000..64f121e --- /dev/null +++ b/default.css | |||
@@ -0,0 +1,80 @@ | |||
1 | @charset "UTF-8"; | ||
2 | |||
3 | html,body { | ||
4 | background: Window; | ||
5 | font: caption; | ||
6 | color: WindowText; | ||
7 | margin:0; | ||
8 | height:100%; | ||
9 | overflow:hidden; | ||
10 | line-height: 1.5; | ||
11 | letter-spacing: 0.033em; | ||
12 | } | ||
13 | |||
14 | body { | ||
15 | padding:2em; | ||
16 | } | ||
17 | |||
18 | h1 { | ||
19 | margin-top:0; | ||
20 | } | ||
21 | |||
22 | label { | ||
23 | font-size:x-small; | ||
24 | color:GrayText; | ||
25 | } | ||
26 | |||
27 | form { | ||
28 | border:2px solid Window; | ||
29 | border-radius: 1em; | ||
30 | padding: 2em; | ||
31 | background: AppWorkspace; | ||
32 | } | ||
33 | |||
34 | input, textarea { | ||
35 | background: Menu; | ||
36 | color: MenuText; | ||
37 | cursor:pointer; | ||
38 | font: caption; | ||
39 | padding: 0.3em 0.5em; | ||
40 | width:25ex; | ||
41 | height:6em; | ||
42 | border: 3px ridge; | ||
43 | border-width: 0px 0px 2px 0px; | ||
44 | border-color: ButtonShadow; | ||
45 | margin-right:2em; | ||
46 | } | ||
47 | |||
48 | input.label { | ||
49 | height:1.5em; | ||
50 | } | ||
51 | |||
52 | input[type="submit"] { | ||
53 | width:inherit; | ||
54 | height:inherit; | ||
55 | border-radius:1ex; | ||
56 | border-width:2px; | ||
57 | font-weight:bold; | ||
58 | background-color: ButtonFace; | ||
59 | color: ButtonText; | ||
60 | } | ||
61 | |||
62 | input:hover, input:active, textarea:hover, textarea:active { | ||
63 | background-color:Highlight; | ||
64 | color:HighlightText; | ||
65 | } | ||
66 | |||
67 | div.content { | ||
68 | position: relative; | ||
69 | width:50%; | ||
70 | } | ||
71 | |||
72 | div.content textarea[name="text"] { | ||
73 | height:12em; | ||
74 | width:100%; | ||
75 | } | ||
76 | |||
77 | br.clear { | ||
78 | clear:both; | ||
79 | } | ||
80 | |||
@@ -4,59 +4,14 @@ | |||
4 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | 4 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
5 | <head> | 5 | <head> |
6 | <title>print label</title> | 6 | <title>print label</title> |
7 | <style> | 7 | <link rel="stylesheet" type="text/css" href="default.css"/> |
8 | html,body { | ||
9 | font: caption; | ||
10 | background-color: Background; | ||
11 | margin:0; | ||
12 | height:100%; | ||
13 | overflow:hidden; | ||
14 | } | ||
15 | body { | ||
16 | padding:2em; | ||
17 | } | ||
18 | h1 { | ||
19 | margin-top:0; | ||
20 | } | ||
21 | label { | ||
22 | font-size:x-small; | ||
23 | color:GrayText; | ||
24 | } | ||
25 | form { | ||
26 | border:2px solid Background; | ||
27 | border-radius: 1em; | ||
28 | padding: 2em; | ||
29 | background: AppWorkspace; | ||
30 | } | ||
31 | input { | ||
32 | background: AppWorkspace; | ||
33 | cursor:pointer; | ||
34 | font: caption; | ||
35 | padding: 0.3em 0.5em; | ||
36 | width:20ex; | ||
37 | border: 3px ridge; | ||
38 | border-width: 0px 0px 3px 0px; | ||
39 | border-color: ButtonShadow; | ||
40 | } | ||
41 | |||
42 | input[type="submit"] { | ||
43 | width:inherit; | ||
44 | background: AppWorkspace; | ||
45 | margin-left:2em; | ||
46 | border-radius:0.5em; | ||
47 | border-width:3px; | ||
48 | font-weight:bold; | ||
49 | } | ||
50 | |||
51 | </style> | ||
52 | </head> | 8 | </head> |
53 | |||
54 | <body> | 9 | <body> |
55 | 10 | ||
56 | <form method="post" enctype="multipart/form-data"> | 11 | <form method="post" enctype="multipart/form-data"> |
57 | <h1>Simple label</h1> | 12 | <h1>Simple label</h1> |
58 | <label>line1<br/><input type="text" name="line1" /></label><br/> | 13 | <label>line1<br/><input type="text" class="label" name="line1" /></label><br/> |
59 | <label>line2<br/><input type="text" name="line2" /></label> | 14 | <label>line2<br/><input type="text" class="label" name="line2" /></label> |
60 | <input type="submit" value="print" /> | 15 | <input type="submit" value="print" /> |
61 | </form> | 16 | </form> |
62 | </body> | 17 | </body> |
diff --git a/letter.html b/letter.html new file mode 100644 index 0000000..19ed778 --- /dev/null +++ b/letter.html | |||
@@ -0,0 +1,24 @@ | |||
1 | <!DOCTYPE html> | ||
2 | <html> | ||
3 | <head> | ||
4 | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | ||
5 | <title>print letter</title> | ||
6 | <link rel="stylesheet" type="text/css" href="default.css"/> | ||
7 | </head> | ||
8 | <body> | ||
9 | <form method="post" enctype="multipart/form-data"> | ||
10 | <h1>Letter</h1> | ||
11 | <div class="content"> | ||
12 | <label>sender<br/><textarea name="sender"></textarea></label><br/> | ||
13 | <label>receiver<br/><textarea name="receiver"></textarea></label><br/> | ||
14 | <label>text<br/><textarea name="text"></textarea></label><br/> | ||
15 | </div> | ||
16 | <input type="submit" value="print" /> | ||
17 | <input type="submit" value="download" /> | ||
18 | <br class="clear" /> | ||
19 | </form> | ||
20 | </body> | ||
21 | </html> | ||
22 | |||
23 | <!-- vim: tabstop=4 shiftwidth=4 expandtab | ||
24 | --> | ||
@@ -132,6 +132,41 @@ int main(const int argc, char const * argv[]) { | |||
132 | int port = atoi(argc > 1 ? argv[1] : "8080"); | 132 | int port = atoi(argc > 1 ? argv[1] : "8080"); |
133 | 0 == port ? port = 8080 : port; | 133 | 0 == port ? port = 8080 : port; |
134 | 134 | ||
135 | |||
136 | // char * pidfile = NULL; | ||
137 | |||
138 | |||
139 | // char ** next_param = NULL; | ||
140 | // for(int i=1; i<argc; i++) { | ||
141 | // switch(strspn(argv[i], "-")) { | ||
142 | // case 1: // one minus (short param) | ||
143 | // if(argv[i][2] != '\0') // one minus, one param and a null char | ||
144 | // break; | ||
145 | // if(next_param) | ||
146 | // err(EXIT_FAILURE, "wrong parameter: %s\n", argv[i]); | ||
147 | // switch(argv[i][1]) { | ||
148 | // case 't': puts("t was chosen"); break; | ||
149 | // case 'e': puts("e was chosen"); break; | ||
150 | // case 's': puts("s was chosen"); break; | ||
151 | // } | ||
152 | // break; | ||
153 | // case 2: // two minus (long param) | ||
154 | // if(next_param) | ||
155 | // err(EXIT_FAILURE, "wrong parameter: %s\n", argv[i]); | ||
156 | // if(0 == strcmp("pidfile", &argv[i][2])) { | ||
157 | // next_param = &pidfile; | ||
158 | // } | ||
159 | // break; | ||
160 | // default: | ||
161 | // // pidfile = (char*) argv[i]; | ||
162 | // *next_param = (char*) argv[i]; | ||
163 | // } | ||
164 | // } | ||
165 | |||
166 | // printf("pidfile is '%s'\n", pidfile); | ||
167 | |||
168 | // return EXIT_SUCCESS; | ||
169 | |||
135 | struct sockaddr_in address = { | 170 | struct sockaddr_in address = { |
136 | .sin_family = AF_INET, | 171 | .sin_family = AF_INET, |
137 | .sin_addr.s_addr = INADDR_ANY, | 172 | .sin_addr.s_addr = INADDR_ANY, |