summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsc1999-02-18 17:33:32 +0000
committersc1999-02-18 17:33:32 +0000
commit2732f1ee8cf7590c53fd52abc9be0c4ee6a4a3c2 (patch)
tree024a4d9385680a6985fc7a57b99abeee9f645f7f
parent3dfd47dde8bb049a797f5dc653105c1cb57af617 (diff)
downloadivyd-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.c18
-rw-r--r--src/ivyd.c49
-rw-r--r--src/ivyd.h2
-rw-r--r--src/ivyecho.c32
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:
diff --git a/src/ivyd.c b/src/ivyd.c
index 6aac230..6dfc27a 100644
--- a/src/ivyd.c
+++ b/src/ivyd.c
@@ -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);
diff --git a/src/ivyd.h b/src/ivyd.h
index 39f2691..58cbeb7 100644
--- a/src/ivyd.h
+++ b/src/ivyd.h
@@ -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;