00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "cgi.h"
00018
00019 #ifdef XP_WIN
00020 #include <winsock2.h>
00021 #else
00022 #include <sys/types.h>
00023 #include <sys/socket.h>
00024 #include <netinet/in.h>
00025 #include <arpa/inet.h>
00026 #include <netdb.h>
00027 #define INVALID_SOCKET 0xFFFFFFFF
00028 #define SOCKADDR struct sockaddr
00029 #endif
00030
00031 int WinsockConnect(char* host, int port, unsigned int*s)
00032 {
00033 long int hostaddr = 0;
00034 unsigned long *p;
00035 struct sockaddr_in svraddr;
00036 struct hostent *he;
00037 *s = INVALID_SOCKET;
00038
00039 if (isdigit(host[0]))
00040 {
00041 hostaddr = inet_addr(host);
00042 }
00043 else
00044 {
00045 he = gethostbyname(host);
00046 if (!he) {return 62;}
00047 p = (unsigned long*)he->h_addr_list[0];
00048 hostaddr = *p;
00049 }
00050
00051 *s = socket(AF_INET, SOCK_STREAM, 0);
00052
00053 if (*s == INVALID_SOCKET) return 63;
00054
00055 svraddr.sin_family = AF_INET;
00056 svraddr.sin_port = htons(port);
00057 memcpy(&svraddr.sin_addr.s_addr, &hostaddr, sizeof(INADDR_ANY));
00058 memset(svraddr.sin_zero,0,sizeof(svraddr.sin_zero));
00059
00060 if (connect(*s, (SOCKADDR*)&svraddr, sizeof(svraddr)) != 0)
00061 return 64;
00062
00063 return 0;
00064 }
00065
00066 int SOAPExec(char* host, int port, char* function, char* action, char* data)
00067 {
00068 unsigned int s;
00069 #ifdef XP_WIN
00070 WSADATA d;
00071 #endif
00072 int err;
00073 char temp[128];
00074
00075 #if 0
00076 #define send(a,b,c,d) fwrite(b,c,1,stdout)
00077 #endif
00078
00079 #ifdef XP_WIN
00080 if (WSAStartup(2, &d) != 0)
00081 {
00082 WSACleanup();
00083 return 61;
00084 }
00085 #endif
00086
00087 err = WinsockConnect(host, port, &s);
00088 if (!err)
00089 {
00090 send(s, "POST /", 6, 0);
00091 send(s, function, strlen(function), 0);
00092 send(s, " HTTP/1.1\r\n", 11, 0);
00093 send(s, "Host: ", 6, 0);
00094 send(s, host, strlen(host), 0);
00095 send(s, "\r\nContent-Type: text/xml; charset=\"utf-8\"\r\n", 43, 0);
00096 send(s, "Content-Length: ", 16, 0);
00097 sprintf(temp,"%d",strlen(data));
00098
00099 send(s, temp, strlen(temp), 0);
00100 send(s, "\r\nSOAPAction: " , 14, 0);
00101 send(s, action, strlen(action), 0);
00102 send(s, "\r\n\r\n", 4, 0);
00103 send(s, data, strlen(data), 0);
00104 }
00105
00106 if (s != INVALID_SOCKET)
00107 { shutdown(s, 2);
00108 #ifdef XP_WIN
00109 closesocket(s);
00110 #else
00111 close(s);
00112 #endif
00113 }
00114 #ifdef XP_WIN
00115 WSACleanup();
00116 #endif
00117 return err;
00118 }