diff options
author | sc | 1999-02-18 17:33:32 +0000 |
---|---|---|
committer | sc | 1999-02-18 17:33:32 +0000 |
commit | 2732f1ee8cf7590c53fd52abc9be0c4ee6a4a3c2 (patch) | |
tree | 024a4d9385680a6985fc7a57b99abeee9f645f7f | |
parent | 3dfd47dde8bb049a797f5dc653105c1cb57af617 (diff) | |
download | ivyd-2732f1ee8cf7590c53fd52abc9be0c4ee6a4a3c2.zip ivyd-2732f1ee8cf7590c53fd52abc9be0c4ee6a4a3c2.tar.gz ivyd-2732f1ee8cf7590c53fd52abc9be0c4ee6a4a3c2.tar.bz2 ivyd-2732f1ee8cf7590c53fd52abc9be0c4ee6a4a3c2.tar.xz |
Port registration is now based on bus number.
This allows to have one server per bus.
-rw-r--r-- | src/inivyd.c | 18 | ||||
-rw-r--r-- | src/ivyd.c | 49 | ||||
-rw-r--r-- | src/ivyd.h | 2 | ||||
-rw-r--r-- | src/ivyecho.c | 32 |
4 files changed, 59 insertions, 42 deletions
diff --git a/src/inivyd.c b/src/inivyd.c index 56d7106..7f4a06f 100644 --- a/src/inivyd.c +++ b/src/inivyd.c @@ -62,20 +62,14 @@ const int default_port = 3006; typedef struct { short s_port; /* le port sur lequel le client communique avec son serveur */ - short s_uid; /* le numero de processus du serveur wixd */ + short s_key; /* le numero de processus du serveur wixd */ } serverinfo; #define TABSIZ 64 /* 64 connections simultanees, ca devrait aller */ serverinfo si_table [TABSIZ]; -/* - * GetInfo (name) - * - * Rend l'information concernant l'utilisateur uid. - */ - serverinfo* -GetInfo (int uid) +GetInfo (int key) { register serverinfo *si; register serverinfo *res = 0; @@ -86,7 +80,7 @@ GetInfo (int uid) res = si; continue; } - if (si->s_uid != uid) + if (si->s_key != key) continue; res = si; break; @@ -113,7 +107,7 @@ DumpInfo () for (si = si_table; si - si_table < TABSIZ; ++si) { if (! si->s_port) continue; - (void) sprintf (buf, "user %5d, port %d\n", si->s_uid, ntohs (si->s_port)); + (void) sprintf (buf, "user %5d, port %d\n", si->s_key, ntohs (si->s_port)); (void) write (fd, buf, strlen (buf)); } (void) close (fd); @@ -202,11 +196,11 @@ main (int argc, const char **argv) continue; exit (1); } - si = GetInfo (msg.msg_uid); + si = GetInfo (msg.msg_key); switch (msg.msg_type) { case MSG_SERVER: si->s_port = msg.msg_port; - si->s_uid = msg.msg_uid; + si->s_key = msg.msg_key; break; case MSG_CLIENT: @@ -37,7 +37,6 @@ const char* const servicename = "ivyd"; const char* const port_env_variable = "INIVYD_PORT"; const int default_port = DEFAULT_INIVYD_PORT; -static char * HomeDir; int debug = 0; static void @@ -54,7 +53,7 @@ Usage (const char* progname) * Envoie un numero de port au super-serveur de la machine locale */ int -SendPort (int port) +SendPort (int key, int port) { struct servent *serv; u_short serv_port; @@ -81,7 +80,11 @@ SendPort (int port) sin.sin_port = serv_port; sin.sin_addr.s_addr = LOCALHOST; - msg.msg_uid = getuid (); +#if 0 + msg.msg_key = getuid (); +#else + msg.msg_key = key; +#endif msg.msg_port = port; msg.msg_type = MSG_SERVER; @@ -104,7 +107,7 @@ failed: int -InitSocket () +InitSocket (int key) { int s, i; struct sockaddr_in addr; @@ -134,7 +137,7 @@ InitSocket () if (debug) printf ("Ivyd listens on port %d\n", ntohs (addr.sin_port)); - if (! SendPort (addr.sin_port)) { + if (! SendPort (key, addr.sin_port)) { fprintf (stderr, "No Ivyd port server. Continuing with port = %d\n", ntohs (addr.sin_port)); } @@ -173,7 +176,8 @@ HandleRequests (void* ch, int fd, void* data) struct sockaddr_in addr; int len = sizeof (addr); - fprintf (stderr, "REQUEST on %d\n", fd); + if (debug) + fprintf (stderr, "REQUEST on %d\n", fd); /* retrieve request */ while (n > 0) { @@ -202,7 +206,8 @@ HandleRequests (void* ch, int fd, void* data) ans.ok = 1; write ( #endif - fprintf (stderr, "REQUEST [%s]\n", req.buffer); + if (debug) + fprintf (stderr, "REQUEST [%s]\n", req.buffer); IvySendMsg (req.buffer); } @@ -212,16 +217,28 @@ HandleConnections (void* ch, int fd, void* data) static struct sockaddr sa; static int acc; int newfd = accept (fd, &sa, &acc); - fprintf (stderr, "CONNECTION %d\n", newfd); + if (debug) + fprintf (stderr, "CONNECTION %d\n", newfd); IvyChannelSetUp (newfd, 0, 0, HandleRequests); } +int +ExtractPort (const char* bus) +{ + int res = DEFAULT_BUS; + const char* p; + if (bus && (p = index (bus, ':'))) { + res = atoi (p+1); + } + return res; +} void main (int argc, char **argv) { int sock; char busbuf [128]; + int busport; const char* bus = 0; int c; @@ -245,22 +262,14 @@ main (int argc, char **argv) if (fork ()) exit (0); + /* determine port in bus address */ + busport = ExtractPort (bus); + /* create server port */ - sock = InitSocket (); + sock = InitSocket (busport); signal (SIGTERM, exit); /* pour flinguer le serveur */ -#if 0 - /* - * Charger le fichier de personnalisation. - */ - HomeDir = getenv ("HOME"); - - if (!HomeDir || !*HomeDir) - fprintf (stderr, "%s: No HOME environment variable.\n", argv0); - else - StartUp (HomeDir); -#endif /* Ivy initialization and main loop */ IvyInit ("IVYD", 0, 0, 0, 0, 0); @@ -27,7 +27,7 @@ #define MSG_SERVER ((char) 2) struct connmsg { - short msg_uid; /* identification de l'expediteur */ + short msg_key; short msg_port; /* le port a utiliser pour l'uid ci-dessus */ char msg_type; /* type de messages */ char msg_fill1, /* fillers */ diff --git a/src/ivyecho.c b/src/ivyecho.c index 468a908..e2ed076 100644 --- a/src/ivyecho.c +++ b/src/ivyecho.c @@ -44,7 +44,7 @@ Usage (const char* progname) { /* Get in touch with super-server and retrieve server's port number */ int -GetPort (long addr) +GetPort (long addr, int key) { struct servent *serv; u_short serv_port; @@ -79,8 +79,12 @@ GetPort (long addr) sin.sin_port = serv_port; sin.sin_addr.s_addr = addr; - /* build request */ - msg.msg_uid = getuid (); + /* build request */ +#if 0 + msg.msg_key = getuid (); +#else + msg.msg_key = key; +#endif msg.msg_port = 0; msg.msg_type = MSG_CLIENT; @@ -107,7 +111,7 @@ failed: } int -ServerOpen (const char *host) +ServerOpen (const char *host, int key) { int sock; static struct sockaddr_in addr; @@ -137,7 +141,7 @@ ServerOpen (const char *host) /* build address from host addr, asking port number to super-server */ memcpy (&addr.sin_addr, hp->h_addr, hp->h_length); addr.sin_family = AF_INET; - addr.sin_port = GetPort (addr.sin_addr.s_addr); + addr.sin_port = GetPort (addr.sin_addr.s_addr, key); if (! addr.sin_port) return 0; @@ -255,9 +259,17 @@ bufferfull: /* now we have a full buffer */ } -/* - * Demande un numero de port au super-serveur de la machine addr - */ +int +ExtractPort (const char* bus) +{ + int res = 2010; + const char* p; + if (bus && (p = index (bus, ':'))) { + res = atoi (p+1); + } + return res; +} + int @@ -265,6 +277,7 @@ main (int argc, char** argv) { char busbuf [128]; const char* bus = 0; + int busport; char serverhostbuf [128]; const char* serverhost = 0; const struct option options [] = { @@ -298,9 +311,10 @@ main (int argc, char** argv) } } + busport = ExtractPort (bus); /* Se connecter au serveur. */ - servfd = ServerOpen (serverhost); + servfd = ServerOpen (serverhost, busport); if (!servfd) { fprintf (stderr, "No server.\n"); return 0; |