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