Index: cachemgr.cc =================================================================== RCS file: /cvsroot/squid/squid3/src/cachemgr.cc,v retrieving revision 1.4 diff -u -p -r1.4 cachemgr.cc --- cachemgr.cc 18 Nov 2002 03:12:57 -0000 1.4 +++ cachemgr.cc 4 Feb 2003 10:01:11 -0000 @@ -171,7 +171,11 @@ static void auth_html(const char *host, static void error_html(const char *msg); static char *menu_url(cachemgr_request * req, const char *action); static int parse_status_line(const char *sline, const char **statusStr); +#ifdef _SQUID_MSWIN_ +static cachemgr_request *read_request(char *); +#else static cachemgr_request *read_request(void); +#endif static char *read_get_request(void); static char *read_post_request(void); @@ -180,6 +184,45 @@ static void decode_pub_auth(cachemgr_req static void reset_auth(cachemgr_request * req); static const char *make_auth_header(const cachemgr_request * req); +#ifdef _SQUID_MSWIN_ +static int s_iInitCount = 0; +int Win32SockInit(void) +{ + int iVersionRequested; + WSADATA wsaData; + int err; + + if (s_iInitCount > 0) { + s_iInitCount++; + return (0); + } + else if (s_iInitCount < 0) + return (s_iInitCount); + + /* s_iInitCount == 0. Do the initailization */ + iVersionRequested = MAKEWORD(2, 0); + err = WSAStartup((WORD) iVersionRequested, &wsaData); + if (err) { + s_iInitCount = -1; + return (s_iInitCount); + } + if (LOBYTE(wsaData.wVersion) != 2 || + HIBYTE(wsaData.wVersion) != 0) { + s_iInitCount = -2; + WSACleanup(); + return (s_iInitCount); + } + s_iInitCount++; + return (s_iInitCount); +} + +void Win32SockCleanup(void) +{ + if (--s_iInitCount == 0) + WSACleanup(); + return; +} +#endif /* ifdef _SQUID_MSWIN_ */ static const char * safe_str(const char *str) @@ -404,7 +447,12 @@ static int read_reply(int s, cachemgr_request * req) { char buf[4 * 1024]; +#ifdef _SQUID_MSWIN_ + int reply; + FILE *fp = tmpfile(); +#else FILE *fp = fdopen(s, "r"); +#endif /* interpretation states */ enum { isStatusLine, isHeaders, isBodyStart, isBody, isForward, isEof, isForwardEof, isSuccess, isError @@ -421,6 +469,11 @@ read_reply(int s, cachemgr_request * req perror("fdopen"); return 1; } +#ifdef _SQUID_MSWIN_ + while ((reply=recv(s,buf,sizeof(buf),0))>0) + fwrite(buf,1,reply,fp); + rewind(fp); +#endif if (parse_menu) action = "menu"; /* read reply interpreting one line at a time depending on state */ @@ -516,6 +569,9 @@ process_request(cachemgr_request * req) static struct sockaddr_in S; int s; int l; +#ifdef _SQUID_MSWIN_ + int answer; +#endif static char buf[2 * 1024]; if (req == NULL) { auth_html(CACHEMGR_HOSTNAME, CACHE_HTTP_PORT, ""); @@ -567,7 +623,13 @@ process_request(cachemgr_request * req) make_auth_header(req)); write(s, buf, l); debug(1) fprintf(stderr, "wrote request: '%s'\n", buf); +#ifdef _SQUID_MSWIN_ + answer=read_reply(s, req); + close(s); + return answer; +#else return read_reply(s, req); +#endif } int @@ -575,16 +637,31 @@ main(int argc, char *argv[]) { char *s; cachemgr_request *req; +#ifdef _SQUID_MSWIN_ + int answer; +#endif safe_inet_addr("255.255.255.255", &no_addr); now = time(NULL); +#ifdef _SQUID_MSWIN_ + Win32SockInit(); + if ((s = strrchr(argv[0], '\\'))) +#else if ((s = strrchr(argv[0], '/'))) +#endif progname = xstrdup(s + 1); else progname = xstrdup(argv[0]); if ((s = getenv("SCRIPT_NAME")) != NULL) script_name = xstrdup(s); +#ifdef _SQUID_MSWIN_ + req = read_request(NULL); + answer=process_request(req); + Win32SockCleanup(); + return answer; +#else req = read_request(); return process_request(req); +#endif } static char * @@ -616,10 +693,16 @@ read_get_request(void) return xstrdup(s); } +#ifdef _SQUID_MSWIN_ +static cachemgr_request * +read_request(char* buf) +{ +#else static cachemgr_request * read_request(void) { char *buf; +#endif cachemgr_request *req; char *s; char *t; @@ -630,7 +713,11 @@ read_request(void) (void) 0; else return NULL; +#ifdef _SQUID_MSWIN_ + if (strlen(buf) == 0 || strlen(buf) == 4000) +#else if (strlen(buf) == 0) +#endif return NULL; req = (cachemgr_request *)xcalloc(1, sizeof(cachemgr_request)); for (s = strtok(buf, "&"); s != NULL; s = strtok(NULL, "&")) {