1 #include <uwsgi.h>
2 
3 /*
4 
5 this plugin, allows remote spooling of jobs
6 
7 */
8 
9 extern struct uwsgi_server uwsgi;
10 
uwsgi_request_spooler(struct wsgi_request * wsgi_req)11 int uwsgi_request_spooler(struct wsgi_request *wsgi_req) {
12 
13 	struct uwsgi_header uh;
14 
15         // TODO get the spooler from the modifier2
16 
17         if (uwsgi.spoolers == NULL) {
18                 uwsgi_log("the spooler is inactive !!!...skip\n");
19 		uh.modifier1 = 255;
20 		uh.pktsize = 0;
21 		uh.modifier2 = 0;
22 		uwsgi_response_write_body_do(wsgi_req, (char *) &uh, 4);
23                 return -1;
24         }
25 
26         char *filename = uwsgi_spool_request(NULL, wsgi_req->buffer, wsgi_req->uh->pktsize, NULL, 0);
27         uh.modifier1 = 255;
28         uh.pktsize = 0;
29         if (filename) {
30                 uh.modifier2 = 1;
31 		if (uwsgi_response_write_body_do(wsgi_req, (char *) &uh, 4)) {
32                         uwsgi_log("disconnected client, remove spool file.\n");
33                         /* client disconnect, remove spool file */
34                         if (unlink(filename)) {
35                                 uwsgi_error("uwsgi_request_spooler()/unlink()");
36                                 uwsgi_log("something horrible happened !!! check your spooler ASAP !!!\n");
37                                 exit(1);
38                         }
39                 }
40 		free(filename);
41                 return 0;
42         }
43         else {
44                 /* announce a failed spool request */
45                 uh.modifier2 = 0;
46 		uwsgi_response_write_body_do(wsgi_req, (char *) &uh, 4);
47         }
48 
49         return -1;
50 }
51 
52 
53 struct uwsgi_plugin spooler_plugin = {
54 
55 	.name = "spooler",
56 	.modifier1 = 17,
57 
58 	.request = uwsgi_request_spooler,
59 };
60