/*
* $Log$
+ * Revision 1.27 2008/03/02 09:55:37 james
+ * *** empty log message ***
+ *
+ * Revision 1.26 2008/02/29 14:55:09 james
+ * *** empty log message ***
+ *
+ * Revision 1.25 2008/02/28 22:43:25 james
+ * *** empty log message ***
+ *
+ * Revision 1.24 2008/02/28 22:00:42 james
+ * *** empty log message ***
+ *
* Revision 1.23 2008/02/28 16:57:51 james
* *** empty log message ***
*
#include "mainloop.h"
extern void usage (void);
-
static char hostname[1024];
+char *socket_dirs[] =
+ { ".sympathy", "sympathy", "/etc/sympathy", "/var/sympathy", NULL };
+
int
safe_atoi (char *a)
{
strcpy (buf, home);
strcat (buf, "/");
+ if (!fmt)
+ return buf;
+
while (1)
{
}
}
+char *
+gloo_paths (char *dir, char *leaf)
+{
+ int i;
+ char *ret, *ptr;
+ ret = ptr = malloc (strlen (dir) + strlen (leaf) + 2);
+
+ while (*dir)
+ *(ptr++) = *(dir++);
+ *(ptr++) = '/';
+ while (*leaf)
+ *(ptr++) = *(leaf++);
+ *ptr = 0;
+
+ return ret;
+}
+
+
int
-list_sockets (void)
+list_sockets_in_dir (char *sockdir)
{
struct dirent *ent;
struct stat buf;
char *sn = NULL;
Socket *s;
- char *sockdir = mome ("/.sympathy/");
DIR *dir = opendir (sockdir);
while ((ent = readdir (dir)))
{
- sn = mome (".sympathy/%s", ent->d_name);
+ sn = gloo_paths (sockdir, ent->d_name);
if (stat (sn, &buf) || (!S_ISSOCK (buf.st_mode)))
{
free (sn);
if (s)
{
- printf ("\t%s (Active)\n", ent->d_name);
+ printf ("\t%s (Active)\n", sn);
socket_free (s);
}
else
{
if (strncmp (ent->d_name, hostname, hostname_len))
{
- printf ("\t%s (Unknown - not this host)\n", ent->d_name);
+ printf ("\t%s (Unknown - not this host)\n", sn);
}
else
{
- printf ("\t%s (Dead, wiped)\n", ent->d_name);
+ printf ("\t%s (Dead, wiped)\n", sn);
unlink (sn);
}
}
return 0;
}
+int
+list_sockets (void)
+{
+ char **ptr, *h;
+
+
+ for (ptr = socket_dirs; *ptr; ptr++)
+ {
+ h = mome (*ptr);
+
+ if (h)
+ {
+ list_sockets_in_dir (h);
+ free (h);
+ }
+
+ }
+
+ return 0;
+}
+
void
get_hostname (void)
extern int optind, opterr, optopt;
CRT_Pos size = { VT102_COLS_80, VT102_ROWS_24 };
+ int csnok_pipe[2] = { 0 };
+ int csnok = 0;
+
int oflags[128];
char *oargs[128];
Log *log = NULL;
int history = 200;
-
+ int pid;
get_hostname ();
fatal_moan ("agrument to -n must be greater than zero");
}
- /*Fold -r into -c */
+ /*Fold -r implies -c */
if (oflags['r'])
- {
- char *id = oargs['r'];
- if (id < 0)
- fatal_moan ("cannot parse -r %s as an integer", oargs['r']);
-
- oflags['k']++;
- if (safe_atoi (id) > 0)
- {
- oargs['k'] = mome ("/.sympathy/%s%d", hostname, safe_atoi (id));
- }
- else
- {
- oargs['k'] = mome ("/.sympathy/%s", id);
- }
- oflags['r'] = 0;
- oflags['c']++;
- }
+ oflags['c']++;
if (oflags['p'] && oflags['d'])
fatal_moan ("-p incompatible with -d");
- /*implement server and client by opening the server socket to prevent */
- /*a race condition, and then forking and munging the cmd line options */
- /*in the parent and child so that the child is the server and the */
- /*parent becomes its client */
if (oflags['c'] && oflags['s'] && oflags['F'])
fatal_moan ("-F is incompatible with -c -s");
- if (oflags['s'] && !oflags['k'])
- {
- char *path;
- path = mome ("/.sympathy");
- mkdir (path, 0700);
- free (path);
-
- oargs['k'] = mome ("/.sympathy/%s%d", hostname, getpid ());
- oflags['k']++;
- }
-
- if (oflags['s'])
- {
- server_socket = socket_listen (oargs['k']);
- if (!server_socket)
- fatal_moan ("failed to create socket %s for listening", oargs['k']);
- }
+ /*implement server and client: this process forks. The parent */
+ /*becomes the client and the child forks again to become the */
+ /*server. If there's no -k argument the client (parent) needs */
+ /*to find out the pid of the server, we use a pipe */
if (oflags['s'] && oflags['c'])
{
- switch (fork ())
+ if (!oflags['k'])
+ {
+ csnok++;
+ pipe (csnok_pipe);
+ }
+
+ switch (pid = fork ())
{
case 0: /*child becomes the server */
oflags['c'] = 0;
oflags['H'] = 0;
+
+ if (csnok)
+ close (csnok_pipe[0]);
break;
case -1:
fatal_moan ("fork failed");
- default:
+ default: /*parent becomes client */
oflags['s'] = 0;
oflags['K'] = 0;
oflags['d'] = 0;
oflags['L'] = 0;
oflags['n'] = 0;
oflags['w'] = 0;
- if (server_socket)
+
+ /*Collect the child */
+ waitpid (pid, NULL, 0);
+
+ /*if there was no k argument we need to find the */
+ /*pid of the server process so that we can work out */
+ /*what the socket is called. The server tells us on */
+ /*a pipe */
+
+ if (csnok)
{
- socket_free_parent (server_socket);
- server_socket = NULL;
+ close (csnok_pipe[1]);
+
+ if (read (csnok_pipe[0], &pid, sizeof (pid)) != sizeof (pid))
+ fatal_moan ("Failed to receive pid of server process");
+
+ close (csnok_pipe[0]);
+
+ oargs['k'] = mome ("/.sympathy/%s%d", hostname, pid);
+ oflags['k']++;
}
}
}
- if (oflags['c'] && !oflags['k'])
- fatal_moan ("-c requires a socket to be specified with -s or -k");
+ if (oflags['c'] && !oflags['k'] && !oflags['r'])
+ fatal_moan ("-c requires a socket to be specified with -s or -k or -r");
if ((oflags['p'] || oflags['d'] || oflags['K'] || oflags['b'] || oflags['f']
|| oflags['L']) && oflags['c'])
if ((size.y > VT102_MAX_ROWS) || (size.y < 1))
fatal_moan ("-w requires a height between 1 and %d\n",
- VT102_MAX_COLS);
+ VT102_MAX_ROWS);
}
if (oflags['s'] && !oflags['F'])
{
- daemon (1, 0); /*incase socket is relative path, unlink then will fail */
+ /*nochdir incase socket is relative path, unlink then will fail */
+ daemon (1, 0);
+
}
+ if (oflags['s'])
+ {
+ char *path;
+ path = mome ("/.sympathy");
+ mkdir (path, 0700);
+ free (path);
+
+
+ if (!oflags['k'])
+ {
+ pid = getpid ();
+
+ oargs['k'] = mome ("/.sympathy/%s%d", hostname, pid);
+ oflags['k']++;
+ }
+
+ server_socket = socket_listen (oargs['k']);
+
+ /*Tell our parent's parent what our pid is */
+ if (csnok)
+ {
+ pid = getpid ();
+
+ write (csnok_pipe[1], &pid, sizeof (pid));
+ close (csnok_pipe[1]);
+ }
+
+ if (!server_socket)
+ fatal_moan ("failed to create socket %s for listening", oargs['k']);
+
+ }
+
if (oflags['s'] || oflags['t'])
{
}
+
+ FISH
+ {
+ char *id = oargs['r'];
+ if (id < 0)
+ fatal_moan ("cannot parse -r %s as an integer", oargs['r']);
+
+ oflags['k']++;
+ if (safe_atoi (id) > 0)
+ {
+ oargs['k'] = find_socket ("%s%d", hostname, safe_atoi (id));
+ }
+ else
+ {
+ oargs['k'] = find_socket ("%s", id);
+ }
+ oflags['r'] = 0;
+ oflags['c']++;
+ }
+
if (oflags['c'])
{