Vanilla Development Mailing List Archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

CVS update: metaserver



Date:	Thursday November 11, 1999 @ 19:12
Author:	unbelver

Update of /home/netrek/cvsroot/metaserver
In directory cvs.castle.real-time.com:/var/tmp/cvs-serv6246

Modified Files:
	PROJECTS disp_web.c main.c meta.h scan.c 
Log Message:
And the PROJECT file says:

- port 1080 web display is blank for most browsers unless they are a long
way from the metaserver.  [rec.games.netrek, "Server List", May 1999]

Fixed by spawning off a new process for each web request.  Original
code just spit out the page without waiting for the browser to submit
a request.  Often, the meta would be finished sending and the
connection would close before the browser was finished.  Many browsers
did not like that.  Now, it waits for something, anything, from the
browser before spitting a page out.  It really doesn't care what it
gets.

--Carlos V.




****************************************

Index: metaserver/PROJECTS
diff -u metaserver/PROJECTS:1.1 metaserver/PROJECTS:1.2
--- metaserver/PROJECTS:1.1	Tue Jun  1 22:02:06 1999
+++ metaserver/PROJECTS	Thu Nov 11 19:12:41 1999
@@ -2,4 +2,5 @@
 
 - port 1080 web display is blank for most browsers unless they are a long
 way from the metaserver.  [rec.games.netrek, "Server List", May 1999]
+[fixed by forking off a different process to handle web requests -c.v]
 
Index: metaserver/disp_web.c
diff -u metaserver/disp_web.c:1.3 metaserver/disp_web.c:1.4
--- metaserver/disp_web.c:1.3	Wed Aug  5 17:49:54 1998
+++ metaserver/disp_web.c	Thu Nov 11 19:12:41 1999
@@ -4,7 +4,7 @@
  * MetaServerII
  * Copyright (c) 1993 by Andy McFadden
  * 
- * $Id: disp_web.c,v 1.3 1998/08/05 22:49:54 tanner Exp $
+ * $Id: disp_web.c,v 1.4 1999/11/12 01:12:41 unbelver Exp $
  * 
  */
 #include <stdio.h>
@@ -34,7 +34,7 @@
 
 
 int
-display_web(idx, port_idx)
+display_web1(idx, port_idx)
      int idx, port_idx;
 {
   register int i;
@@ -46,18 +46,53 @@
   char *cp;
 
   up = &users[idx];
+
+  if(up->buf)
+    {
+      free(up->buf);
+      up->buf = NULL;
+    }
+
   up->data_size = up->buf_size = up->pos = 0;
 
   now = time(0);
+ 
 
-  /* print header */
+  /* print server header */
   Uprintf(idx, "HTTP/1.0 200 OK\n");
   Uprintf(idx, "Server: netrekmetarc/1.0\n");
   Uprintf(idx, "MIME-version: 1.0\n");
   Uprintf(idx, "Content-type: text/html\n\n");
+  return 0;
+}
+
+display_web2(idx, port_idx)
+     int idx, port_idx;
+{
+  register int i;
+  USER *up;
+  SERVER *sp;
+  time_t now;
+  int srv, ago, *sorted;
+  char flagbuf[8], buf[128];
+  char *cp;
+
+  up = &users[idx];
+
+  if(up->buf)
+    {
+      free(up->buf);
+      up->buf = NULL;
+    }
+
+  up->data_size = up->buf_size = up->pos = 0;
+
+  now = time(0);
+
+  /* print page */
   Uprintf(idx, "\
-<title>MetaServer II Server List</title>\n\
-<h1>MetaServer II Server List</h1>\n");
+<html><title>MetaServer II Server List</title>\n\
+<body><center><h1>MetaServer II Server List</h1></center>\n");
 
   Uprintf(idx, "<center><table border=2 cellpadding=6><tr>\
 <td><h4>Server Host</h4></td>\
@@ -151,7 +186,8 @@
   Uprintf(idx, "retry periods in minutes are ");
   Uprintf(idx, "down:%d empty:%d open:%d queue:%d)</i><p>\n\n",
 	  wait_noconn, wait_empty, wait_open, wait_queue);
-  Uprintf(idx, "<p>Link to <a href=\"http://metaserver.netrek.org:1080/\">US metaserver</a>\n");
+  Uprintf(idx, "<p>Link to <a href=\"http://metaserver.netrek.org:1080/\">US metaserver</a><p>\n");
+  Uprintf(idx, "<p>Link to <a href=\"http://metaserver.eu.netrek.org:1080/\">European metaserver</a></body></html>\n");
 
   return(0);
 }
Index: metaserver/main.c
diff -u metaserver/main.c:2.0 metaserver/main.c:2.1
--- metaserver/main.c:2.0	Tue Oct 27 21:48:05 1998
+++ metaserver/main.c	Thu Nov 11 19:12:41 1999
@@ -4,7 +4,7 @@
  * MetaServerII
  * Copyright (c) 1993 by Andy McFadden
  * 
- * $Id: main.c,v 2.0 1998/10/28 03:48:05 unbelver Exp $
+ * $Id: main.c,v 2.1 1999/11/12 01:12:41 unbelver Exp $
  * 
  */
 #include <stdio.h>
@@ -684,6 +684,8 @@
   /*SIGNAL(SIGSEGV, sig_crash);*/
 
   SIGNAL(SIGALRM, wakeup);
+
+  SIGNAL(SIGCHLD, sig_child);
 }
 
 
Index: metaserver/meta.h
diff -u metaserver/meta.h:2.0 metaserver/meta.h:2.1
--- metaserver/meta.h:2.0	Tue Oct 27 21:48:05 1998
+++ metaserver/meta.h	Thu Nov 11 19:12:41 1999
@@ -4,7 +4,7 @@
  * MetaServerII
  * Copyright (c) 1993 by Andy McFadden
  * 
- * $Id: meta.h,v 2.0 1998/10/28 03:48:05 unbelver Exp $
+ * $Id: meta.h,v 2.1 1999/11/12 01:12:41 unbelver Exp $
  * 
  */
 /*#define DEBUG*/
@@ -29,8 +29,12 @@
 #define FLOOD_TIME	10		/* ...over this many seconds. */
 
 /* server flood controls */
-#define MIN_UREAD_TIME  60
+#define MIN_UREAD_TIME  58
 
+#define MAX_WEB_TIME    30              /* maximum amount of time a web */
+                                        /* request may last in seconds  */
+#define MAX_WEB_BYTES 1024              /* biggest packet I'm expecting */
+#define MAX_NUM_WEB     20              /* eh. 20 processes seems ok    */
 /*
  * end of configurable stuff
  */
@@ -163,6 +167,7 @@
 extern long lookup(/*char *host, char *iphost*/);
 extern int wakeup(/*signal handler*/);
 extern int *sort_servers(/*void*/);
+void sig_child(/*signal handler*/);  /* the child reaper */
 
 /* global variables */
 extern int verbose,
Index: metaserver/scan.c
diff -u metaserver/scan.c:2.7 metaserver/scan.c:2.8
--- metaserver/scan.c:2.7	Sun May 30 21:53:46 1999
+++ metaserver/scan.c	Thu Nov 11 19:12:41 1999
@@ -4,7 +4,7 @@
  * MetaServerII
  * Copyright (c) 1993 by Andy McFadden
  * 
- * $Id: scan.c,v 2.7 1999/05/31 02:53:46 cameron Exp $
+ * $Id: scan.c,v 2.8 1999/11/12 01:12:41 unbelver Exp $
  * 
  */
 #include <stdio.h>
@@ -12,6 +12,7 @@
 #include <sys/types.h>
 #include <sys/time.h>
 #include <sys/socket.h>
+#include <sys/wait.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <netdb.h>
@@ -19,6 +20,7 @@
 #include <string.h>
 /* #include <strings.h> */
 #include <unistd.h>
+#include <signal.h>
 #include "meta.h"
 
 
@@ -46,15 +48,21 @@
 
 USER *users;
 
+extern int save_ckp;
+
 /*
  * Private variables
  */
 static fd_set readfd_set, writefd_set;
 static int maxfd;
 static /*volatile*/ int coffee;	/* wake up and smell the */
-
 
 /*
+ * web process housekeeping and functions 
+ */
+static int numweb = 0;          /* number of web processes */
+void do_web(int, int);
+/*
  * ---------------------------------------------------------------------------
  *	initialization/setup
  * ---------------------------------------------------------------------------
@@ -366,7 +374,9 @@
     display_new(csock, idx);
     break;
   case DI_WEB:
-    display_web(csock, idx);
+    do_web(csock, idx);
+    close(csock);
+    return;
     break;
   case DI_VERBOSE:
     display_verbose(csock, idx);
@@ -1291,3 +1301,118 @@
   /*NOTREACHED*/
 }
 
+/*
+ *  Web related functions
+ *
+ */
+
+void sig_euthanize(void)
+{
+  exit(0);  /* I'm been alive too long, time to die */
+}
+
+void sig_child(void)
+{
+  int pid;
+
+  while (1)  /* may receive 1 signal for multiple child exits */
+   {
+     pid = waitpid(0, NULL, WNOHANG); /* reap the child */
+     if (pid > 0)
+       numweb--;                      /* one less mouth to feed */
+     else
+       break;
+   }
+}
+
+void handle_web(int idx, int port_idx)
+{
+
+  char inpacket[MAX_WEB_BYTES];
+  int cc, i, argvlen;
+ 
+  FD_SET(idx, &writefd_set);
+
+  save_ckp = FALSE; /* don't want each web process saving a checkpoint */
+
+  SIGNAL(SIGALRM, sig_euthanize);
+
+  alarm(MAX_WEB_TIME);  /* just in case the browser takes too long */
+
+  /* display the server header */
+  display_web1(idx, port_idx);
+
+  while(users[idx].data_size)
+    {
+      if ((cc = write(idx, users[idx].buf+users[idx].pos, users[idx].data_size)) < 0)
+	{    
+	  log_msg("write error in handle_web = %d", errno);
+	  close_user(idx);
+	  return;
+	}
+      users[idx].pos += cc;
+      users[idx].data_size -= cc;
+    }
+
+  /* wait for browser "request" */
+  /* I don't care what I get */
+  recv(idx, inpacket, MAX_WEB_BYTES, 0);
+
+  /* display "web page" */
+  display_web2(idx, port_idx );
+
+  while(users[idx].data_size)
+    {
+      if ((cc = write(idx, users[idx].buf+users[idx].pos, users[idx].data_size)) < 0)
+	{    
+	  log_msg("write error in handle_web = %d", errno);
+	  close_user(idx);
+	  return;
+	}
+      users[idx].pos += cc;
+      users[idx].data_size -= cc;
+    }
+
+  close_user(idx);  /* clean out the data structure */
+  
+  /* and this process is done */
+  exit(0); 
+}
+
+int web_fork(int idx, int port_idx)
+{
+  int webpid;                     /* pid of last web process */
+  if ( (webpid = fork()) < 0 )
+    {
+      log_msg("web_fork: couldn't fork web process");
+      return 1;
+    }
+  else
+    { 
+      if(!webpid)
+	handle_web(idx, port_idx);
+      else
+	return 0;
+    }
+        
+}
+
+/* 
+ * wrapper for the web stuff in case I want to limit # of simultaneous
+ * connections.
+ *
+ * Yup. it looks like I do.
+ */
+void do_web(int idx, int port_idx)
+{
+  if (numweb > MAX_NUM_WEB)
+    {
+      log_msg("do_web: too many active web processes");
+      return;
+    }
+  else
+    {                           /* count number of processes and fork */
+      numweb++;
+      web_fork(idx, port_idx);
+    }
+}