21 #include <sys/prctl.h>
48 retval = soap_serve(soap);
50 if (retval == SOAP_STOP) {
52 (soap->ip >> 24) & 0xff,(soap->ip >> 16) & 0xff,
53 (soap->ip >> 8) & 0xff,soap->ip & 0xff);
57 if (soap->error != SOAP_OK) {
58 verror(
"could not handle SOAP_STOP by proxing request!\n");
73 else if (soap->error == SOAP_OK) {
76 "finished request from %d.%d.%d.%d; new monitor thread %lu\n",
77 (soap->ip >> 24) & 0xff,(soap->ip >> 16) & 0xff,
78 (soap->ip >> 8) & 0xff,soap->ip & 0xff,
83 snprintf(name,16,
"%s_m_%d",svc_name,monitor->
objid);
84 prctl(PR_SET_NAME,name,NULL,NULL,NULL);
95 verror(
"bad internal error in monitor for %s %d; destroying!\n",
96 svc_name,monitor->
objid);
104 "monitoring on %s %d is done; finalizing!\n",
105 svc_name,monitor->
objid);
110 "monitoring on %s %d is done;"
112 svc_name,monitor->
objid);
119 vwarn(
"%s %d monitor_run returned unexpectedly;"
120 " closing (not finalizing)!\n",
121 svc_name,monitor->
objid);
133 "finished request from %d.%d.%d.%d\n",
134 (soap->ip >> 24) & 0xff,(soap->ip >> 16) & 0xff,
135 (soap->ip >> 8) & 0xff,soap->ip & 0xff);
138 retval = soap->error;
148 (soap->ip >> 24) & 0xff,(soap->ip >> 16) & 0xff,
149 (soap->ip >> 8) & 0xff,soap->ip & 0xff,soap->error);
151 retval = soap->error;
177 static size_t _soap_proxyreq_frecv_save(
struct soap *soap,
char *s,
size_t n) {
185 verror(
"no proxyreq state!\n");
186 return soap_receiver_fault(soap,
"Internal error!",
187 "Internal error: no proxyreq state!");
200 if (retval > (
size_t)(pr->
bufsiz - pr->
len)) {
207 memcpy(&pr->
buf[pr->
len],s,retval);
217 static size_t _soap_proxyreq_frecv_read(
struct soap *soap,
char *s,
size_t n) {
224 return soap_receiver_fault(soap,
"Internal error!",
225 "Internal error: no proxyreq!");
229 retval = (n > retval) ? retval : n;
236 soap->error = SOAP_OK;
239 soap->error = SOAP_OK;
260 static int _soap_proxyreq_fsend(
struct soap *soap,
const char *s,
size_t n) {
266 return soap_receiver_fault(soap,
"Internal error!",
267 "Internal error: no proxyreq!");
271 pr->
bufsiz = (n > 1024) ? n : 1024;
274 else if ((
unsigned)(pr->
bufsiz - pr->
len) < n) {
285 memcpy(pr->
buf + pr->
len,s,n);
291 static int _soap_proxyreq_noclose(
struct soap *soap) {
302 verror(
"soap->user already set; already proxied this request?!\n");
306 pr =
calloc(1,
sizeof(*pr));
308 pr->
tid = pthread_self();
319 soap->frecv = _soap_proxyreq_frecv_save;
322 soap->fclose = _soap_proxyreq_noclose;
338 verror(
"no monitor for object %d!\n",objid);
342 soap =
calloc(1,
sizeof(*soap));
346 pr =
calloc(1,
sizeof(*pr));
349 pr->
tid = pthread_self();
367 soap->frecv = _soap_proxyreq_frecv_read;
379 pr->
soap->fsend = _soap_proxyreq_fsend;
382 soap_set_omode(pr->
soap,SOAP_IO_STORE);
395 pr->
soap->frecv = _soap_proxyreq_frecv_read;
402 verror(
"proxyreq already attached to a monitor!\n");
407 verror(
"no monitor for object %d!\n",objid);
424 verror(
"proxyreq already attached to a monitor!\n");
444 #define PROXYREQ_REQUEST 1
445 #define PROXYREQ_RESPONSE 2
500 verror(
"could not send msg to monitored child!\n");
521 verror(
"monitor is not bidirectional!\n");
542 verror(
"could not send msg to monitor!\n");
570 if (soap->error == SOAP_OK) {
572 "finished forked proxied request from %d.%d.%d.%d\n",
573 (soap->ip >> 24) & 0xff,(soap->ip >> 16) & 0xff,
574 (soap->ip >> 8) & 0xff,soap->ip & 0xff);
578 "failingly finished forked proxied request from %d.%d.%d.%d\n",
579 (soap->ip >> 24) & 0xff,(soap->ip >> 16) & 0xff,
580 (soap->ip >> 8) & 0xff,soap->ip & 0xff);
595 if (soap->error == SOAP_OK) {
597 "finished threaded proxied request from %d.%d.%d.%d\n",
598 (soap->ip >> 24) & 0xff,(soap->ip >> 16) & 0xff,
599 (soap->ip >> 8) & 0xff,soap->ip & 0xff);
603 "failingly finished threaded proxied request from %d.%d.%d.%d\n",
604 (soap->ip >> 24) & 0xff,(soap->ip >> 16) & 0xff,
605 (soap->ip >> 8) & 0xff,soap->ip & 0xff);
629 verror(
"cannot associated a proxyreq request handler thread with monitor child msg!\n");
644 soap_begin_send(soap);
653 if (strncmp(msg->
msg,
"Status:",7) == 0) {
655 rc = snprintf(buf,16,
"HTTP/%s",soap->http_version);
656 soap_send_raw(soap,buf,rc);
662 soap_send_raw(soap,sptr,msg->
len - (sptr - msg->
msg));
665 soap_closesock(soap);
667 if (soap->error == SOAP_OK) {
669 "finished proxied request from %d.%d.%d.%d\n",
670 (soap->ip >> 24) & 0xff,(soap->ip >> 16) & 0xff,
671 (soap->ip >> 8) & 0xff,soap->ip & 0xff);
675 "failingly finished proxy request from %d.%d.%d.%d\n",
676 (soap->ip >> 24) & 0xff,(soap->ip >> 16) & 0xff,
677 (soap->ip >> 8) & 0xff,soap->ip & 0xff);
736 #define THREAD_SPLITREQ(soap,tm) { \
737 struct splitreq *_sr; \
738 _sr = (struct splitreq *)(soap)->user; \
740 verror("no splitreq state!\n"); \
743 if ((soap)->frecv == splitreq_frecv_save) { \
744 splitreq_split((soap),0); \
748 else if ((soap)->frecv == splitreq_frecv_read) { \
749 splitreq_fini(soap); \
753 verror("unexpected soap->frecv value; user error?!\n"); \
757 #define FORK_SPLITREQ(soap,tm) { \
758 struct splitreq *_sr; \
759 struct splitreq_data srd; \
761 _sr = (struct splitreq *)(soap)->user; \
763 verror("no splitreq state!\n"); \
766 if ((soap)->frecv == splitreq_frecv_save) { \
767 splitreq_split((soap),1); \
768 _srd.buf = _sr->buf; \
769 _srd.buflen = _sr->buflen; \
770 if (process_monitor_send_request(tm,&srd)) { \
771 verror("could not send request to pid %d",tm->p.pid); \
777 else if ((soap)->frecv == splitreq_frecv_read) { \
778 splitreq_fini(soap); \
782 verror("unexpected soap->frecv value; user error?!\n"); \
void monitor_msg_free_save_buffer(struct monitor_msg *msg)
int proxyreq_recv_request(struct monitor *monitor, struct monitor_msg *msg)
int monitor_objects(struct monitor *monitor)
int proxyreq_attach_objid(struct proxyreq *pr, int objid)
#define PROXYREQ_RESPONSE
struct monitor_msg * monitor_msg_create(int objid, int id, short cmd, short seqno, int buflen, char *buf, void *msg_obj)
int monitor_is_done(struct monitor *monitor)
int monitor_send(struct monitor_msg *msg)
#define verror(format,...)
int proxyreq_attach_new_objid(struct proxyreq *pr, int objid, struct monitor *monitor)
#define vwarn(format,...)
int proxyreq_switchto_proxied(struct proxyreq *pr)
int monitor_child_send(struct monitor_msg *msg, struct monitor *monitor)
void proxyreq_detach_soap(struct proxyreq *pr)
int(* orig_fsend)(struct soap *soap, const char *s, size_t n)
int proxyreq_send_response(struct proxyreq *pr)
#define vdebug(devel, areas, flags, format,...)
void * realloc(void *ptr, size_t size)
void monitor_msg_free(struct monitor_msg *msg)
#define PROXY_REQUEST_HANDLE_STOP(soap)
int(* orig_fclose)(struct soap *soap)
void * calloc(size_t nmemb, size_t size)
int monitor_shutdown(struct monitor *monitor)
int proxyreq_handle_request(struct soap *soap, char *svc_name)
size_t(* orig_frecv)(struct soap *soap, char *s, size_t n)
int monitor_lookup_objid(int objid, int *objtype, void **obj, struct monitor **monitor)
int proxyreq_recv_response(struct monitor *monitor, struct monitor_msg *msg)
void proxyreq_free_buffer(struct proxyreq *pr)
void * malloc(size_t size)
struct proxyreq * proxyreq_create(struct soap *soap)
int proxyreq_send_request(struct proxyreq *pr)
int monitor_destroy(struct monitor *monitor)
void proxyreq_free(struct proxyreq *pr)
int monitor_run(struct monitor *monitor)
struct proxyreq * proxyreq_create_proxied(int objid, char *buf, int buflen)