Hi,

This is the 4th of some splitted native Windows patches grouped by functionality.

Native Windows port enhancements:

- Added native Windows support to cachemgr.cc
- Added native Windows support to dnsserver.cc
- On Windows, fork() is not available, so we need to use a workaround in store_dir.cc for create store directories sequentially

Regards

Guido


-
=======================================================
Serassio Guido
Via Albenga, 11/4 10134 - Torino - ITALY
E-mail: [EMAIL PROTECTED]
WWW: http://www.serassio.it
Index: store_dir.cc
===================================================================
RCS file: /cvsroot/squid/squid3/src/store_dir.cc,v
retrieving revision 1.6
diff -u -p -r1.6 store_dir.cc
--- store_dir.cc        23 Jan 2003 03:14:42 -0000      1.6
+++ store_dir.cc        4 Feb 2003 10:09:19 -0000
@@ -77,12 +77,22 @@ void
 storeCreateSwapDirectories(void)
 {
     int i;
+/* 
+ * On Windows, fork() is not available.
+ * The following is a workaround for create store directories sequentially
+ * when running on native Windows port.
+ */
+#ifndef _SQUID_MSWIN_
     pid_t pid;
     int status;
+#endif
     for (i = 0; i < Config.cacheSwap.n_configured; i++) {
+#ifndef _SQUID_MSWIN_
        if (fork())
            continue;
+#endif
        INDEXSD(i)->newFileSystem();
+#ifndef _SQUID_MSWIN_
        exit(0);
     }
     do {
@@ -92,6 +102,9 @@ storeCreateSwapDirectories(void)
        pid = waitpid(-1, &status, 0);
 #endif
     } while (pid > 0 || (pid < 0 && errno == EINTR));
+#else
+    }
+#endif
 }
 
 /*
Index: dnsserver.cc
===================================================================
RCS file: /cvsroot/squid/squid3/src/dnsserver.cc,v
retrieving revision 1.3
diff -u -p -r1.3 dnsserver.cc
--- dnsserver.cc        18 Nov 2002 03:12:57 -0000      1.3
+++ dnsserver.cc        4 Feb 2003 10:05:52 -0000
@@ -142,7 +142,7 @@
 #include "util.h"
 #include "snprintf.h"
 
-#if !defined(_SQUID_AIX_)
+#if !defined(_SQUID_AIX_) && !defined(_SQUID_MSWIN_)
 extern int h_errno;
 #endif
 
@@ -340,6 +340,14 @@ main(int argc, char *argv[])
        }
     }
 
+#ifdef _SQUID_MSWIN_
+    {
+       WSADATA wsaData;
+
+       WSAStartup(2, &wsaData);
+    }
+    fflush(stderr);
+#endif
     for (;;) {
        memset(request, '\0', REQ_SZ);
        if (fgets(request, REQ_SZ, stdin) == NULL)
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, "&")) {


Reply via email to