diff options
| -rw-r--r-- | apps/clients.c | 177 | ||||
| -rw-r--r-- | apps/clients.h | 9 | ||||
| -rw-r--r-- | apps/mainloop.c | 407 | ||||
| -rw-r--r-- | apps/mainloop.h | 7 | ||||
| -rw-r--r-- | apps/sympathy.c | 668 | ||||
| -rw-r--r-- | src/ansi.c | 5 | 
6 files changed, 624 insertions, 649 deletions
| diff --git a/apps/clients.c b/apps/clients.c index d5bd256..4c4ea21 100644 --- a/apps/clients.c +++ b/apps/clients.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$";  /*   * $Log$ + * Revision 1.15  2008/03/02 10:27:24  james + * *** empty log message *** + *   * Revision 1.14  2008/02/28 16:57:51  james   * *** empty log message ***   * @@ -65,44 +68,43 @@ static char rcsid[] = "$Id$";  void  client_msg (IPC_Msg * m, Context * c)  { -  switch (m->hdr.type) -    { - -    case IPC_MSG_TYPE_NOOP: -      break; -    case IPC_MSG_TYPE_DEBUG: -      fprintf (stderr, "%p [%d] %s\n", m, m->hdr.size, m->debug.msg); -      break; -    case IPC_MSG_TYPE_KEY: -      vt102_send (c, m->key.key); -      break; -    case IPC_MSG_TYPE_SETBAUD: -      tty_set_baud (c->t, m->setbaud.baud); -      tty_parse_reset (c); - -      log_f (c->l, "<baud changed to %d>", m->setbaud.baud); -      break; -    case IPC_MSG_TYPE_SENDBREAK: -      tty_send_break (c->t); -      break; -    case IPC_MSG_TYPE_SETFLOW: -      tty_set_flow (c->t, m->setflow.flow); -      break; -    case IPC_MSG_TYPE_SETANSI: -      vt102_set_ansi (c->v, m->setansi.ansi); -      break; -    case IPC_MSG_TYPE_HANGUP: -      tty_hangup (c->t); -      break; -    case IPC_MSG_TYPE_SETSIZE: -      vt102_resize (c, m->setsize.winsize); -      break; -    case IPC_MSG_TYPE_RESET: -      vt102_reset (c); -      break; -    default: -      fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type); -    } +  switch (m->hdr.type) { + +  case IPC_MSG_TYPE_NOOP: +    break; +  case IPC_MSG_TYPE_DEBUG: +    fprintf (stderr, "%p [%d] %s\n", m, m->hdr.size, m->debug.msg); +    break; +  case IPC_MSG_TYPE_KEY: +    vt102_send (c, m->key.key); +    break; +  case IPC_MSG_TYPE_SETBAUD: +    tty_set_baud (c->t, m->setbaud.baud); +    tty_parse_reset (c); + +    log_f (c->l, "<baud changed to %d>", m->setbaud.baud); +    break; +  case IPC_MSG_TYPE_SENDBREAK: +    tty_send_break (c->t); +    break; +  case IPC_MSG_TYPE_SETFLOW: +    tty_set_flow (c->t, m->setflow.flow); +    break; +  case IPC_MSG_TYPE_SETANSI: +    vt102_set_ansi (c->v, m->setansi.ansi); +    break; +  case IPC_MSG_TYPE_HANGUP: +    tty_hangup (c->t); +    break; +  case IPC_MSG_TYPE_SETSIZE: +    vt102_resize (c, m->setsize.winsize); +    break; +  case IPC_MSG_TYPE_RESET: +    vt102_reset (c); +    break; +  default: +    fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type); +  }  }  void @@ -148,21 +150,17 @@ clients_reap (Clients * cs)    Client **p, *c; -  for (p = &cs->head; *p;) -    { -      Client *c = *p; - -      if (c->dead) -        { -          *p = c->next; -          client_free (c); -          cs->n--; -        } -      else -        { -          p = &(c->next); -        } +  for (p = &cs->head; *p;) { +    Client *c = *p; + +    if (c->dead) { +      *p = c->next; +      client_free (c); +      cs->n--; +    } else { +      p = &(c->next);      } +  }  }  Clients * @@ -181,10 +179,9 @@ clients_pre_select (Clients * cs, fd_set * rfds, fd_set * wfds)  {    Client *c; -  for (c = cs->head; c; c = c->next) -    { -      socket_pre_select (c->s, rfds, wfds); -    } +  for (c = cs->head; c; c = c->next) { +    socket_pre_select (c->s, rfds, wfds); +  }  }  void @@ -194,22 +191,19 @@ clients_post_select (Clients * cs, Context * ctx, fd_set * rfds,    Client *c;    int deaded = 0; -  for (c = cs->head; c; c = c->next) -    { -      if (socket_post_select (c->s, rfds, wfds)) -        { -          c->dead++; -          deaded++; -        } - -      if (c->s->msg) -        { -          client_msg (c->s->msg, ctx); -          socket_consume_msg (c->s); -        } +  for (c = cs->head; c; c = c->next) { +    if (socket_post_select (c->s, rfds, wfds)) { +      c->dead++; +      deaded++; +    } +    if (c->s->msg) { +      client_msg (c->s->msg, ctx); +      socket_consume_msg (c->s);      } +  } +    if (deaded)      clients_reap (cs);  } @@ -220,10 +214,9 @@ clients_shutdown (Clients * cs)  {    Client *c; -  for (c = cs->head; c; c = c->next) -    { -      c->dead++; -    } +  for (c = cs->head; c; c = c->next) { +    c->dead++; +  }    clients_reap (cs); @@ -257,12 +250,11 @@ send_status (Clients * cs, char *msg)    strncpy (m->status, msg, IPC_MAX_BUF);    m->status[IPC_MAX_BUF - 1] = 0; -  for (c = cs->head; c; c = c->next) -    { -      if (!c->dead) -        if (ipc_msg_send (c->s, (IPC_Msg *) m)) -          c->dead++; -    } +  for (c = cs->head; c; c = c->next) { +    if (!c->dead) +      if (ipc_msg_send (c->s, (IPC_Msg *) m)) +        c->dead++; +  }    return len;  } @@ -286,12 +278,11 @@ send_output (Clients * cs, void *buf, int len)    m->len = len;    memcpy (m->term, buf, len); -  for (c = cs->head; c; c = c->next) -    { -      if (!c->dead) -        if (ipc_msg_send (c->s, (IPC_Msg *) m)) -          c->dead++; -    } +  for (c = cs->head; c; c = c->next) { +    if (!c->dead) +      if (ipc_msg_send (c->s, (IPC_Msg *) m)) +        c->dead++; +  }    return len; @@ -305,18 +296,16 @@ send_history (History * h, Client * c)    HISTORY_INC (h, rptr);    HISTORY_INC (h, rptr); -  while (rptr != h->wptr) -    { -      History_ent *l = &h->lines[rptr]; -      if (l->valid) -        { +  while (rptr != h->wptr) { +    History_ent *l = &h->lines[rptr]; +    if (l->valid) { -          if (ipc_msg_send_history (c->s, l)) -            c->dead++; +      if (ipc_msg_send_history (c->s, l)) +        c->dead++; -        } -      HISTORY_INC (h, rptr);      } +    HISTORY_INC (h, rptr); +  }  }  void diff --git a/apps/clients.h b/apps/clients.h index f8dd9f1..c233e5f 100644 --- a/apps/clients.h +++ b/apps/clients.h @@ -12,6 +12,9 @@  /*   * $Log$ + * Revision 1.6  2008/03/02 10:27:24  james + * *** empty log message *** + *   * Revision 1.5  2008/02/14 10:34:47  james   * *** empty log message ***   * @@ -32,15 +35,13 @@  #ifndef __CLIENTS_H__  #define __CLIENTS_H__ -typedef struct Client_struct -{ +typedef struct Client_struct {    struct Client_struct *next;    Socket *s;    int dead;  } Client; -typedef struct -{ +typedef struct {    Client *head;    int n;  } Clients; diff --git a/apps/mainloop.c b/apps/mainloop.c index 9737bd2..25718c4 100644 --- a/apps/mainloop.c +++ b/apps/mainloop.c @@ -11,6 +11,9 @@ static char rcsid[] =  /*   * $Log$ + * Revision 1.21  2008/03/02 10:27:24  james + * *** empty log message *** + *   * Revision 1.20  2008/02/28 16:57:51  james   * *** empty log message ***   * @@ -117,8 +120,7 @@ static char rcsid[] =  Context *context; -typedef struct -{ +typedef struct {    int nclients;    int lines;    int baud; @@ -155,11 +157,10 @@ get_status (TTY * t, Clients * cs)    cd = (tty_status.lines & TIOCM_CD) ? 1 : 0; -  if (cd != last_cd_state) -    { -      gettimeofday (&last_cd_edge, NULL); -      last_cd_state = cd; -    } +  if (cd != last_cd_state) { +    gettimeofday (&last_cd_edge, NULL); +    last_cd_state = cd; +  }    gettimeofday (&now, NULL);    timersub (&now, &last_cd_edge, &dif); @@ -172,45 +173,44 @@ static char *  line_to_name (int l)  { -  switch (l) -    { +  switch (l) {  #ifdef TIOCM_LE -    case TIOCM_LE: -      return "LE"; +  case TIOCM_LE: +    return "LE";  #endif  #ifdef TIOCM_DTR -    case TIOCM_DTR: -      return "DTR"; +  case TIOCM_DTR: +    return "DTR";  #endif  #ifdef TIOCM_RTS -    case TIOCM_RTS: -      return "RTS"; +  case TIOCM_RTS: +    return "RTS";  #endif  #ifdef TIOCM_ST -    case TIOCM_ST: -      return "ST"; +  case TIOCM_ST: +    return "ST";  #endif  #ifdef TIOCM_SR -    case TIOCM_SR: -      return "SR"; +  case TIOCM_SR: +    return "SR";  #endif  #ifdef TIOCM_CTS -    case TIOCM_CTS: -      return "CTS"; +  case TIOCM_CTS: +    return "CTS";  #endif  #ifdef TIOCM_CD -    case TIOCM_CD: -      return "CD"; +  case TIOCM_CD: +    return "CD";  #endif  #ifdef TIOCM_RI -    case TIOCM_RI: -      return "RI"; +  case TIOCM_RI: +    return "RI";  #endif  #ifdef TIOCM_DSR -    case TIOCM_DSR: -      return "DSR"; +  case TIOCM_DSR: +    return "DSR";  #endif -    } +  }    return "??";  } @@ -232,20 +232,18 @@ log_line_changes (Context * ctx, int old, int new)    while (*n)      *(ptr++) = *(n++); -  while (dif >= c) -    { - -      if (dif & c) -        { -          *(ptr++) = ' '; -          *(ptr++) = (new & c) ? '+' : '-'; -          n = line_to_name (c); -          while (*n) -            *(ptr++) = *(n++); -        } +  while (dif >= c) { -      c <<= 1; +    if (dif & c) { +      *(ptr++) = ' '; +      *(ptr++) = (new & c) ? '+' : '-'; +      n = line_to_name (c); +      while (*n) +        *(ptr++) = *(n++);      } + +    c <<= 1; +  }    *(ptr++) = '>';    *ptr = 0; @@ -306,55 +304,45 @@ check_status (Context * c, Clients * cs)    ptr = do_line (ptr, status.lines, TIOCM_RI);    ptr = do_line (ptr, status.lines, TIOCM_CD); -  if (status.blocked) -    { -      t = ", Locked"; -      while (*t) -        *(ptr++) = *(t++); -    } - -  if (status.crtscts) -    { -      t = ", Flow"; -      while (*t) -        *(ptr++) = *(t++); -    } - +  if (status.blocked) { +    t = ", Locked"; +    while (*t) +      *(ptr++) = *(t++); +  } + +  if (status.crtscts) { +    t = ", Flow"; +    while (*t) +      *(ptr++) = *(t++); +  }  #if 0 -  if (status.lines & TIOCM_CD) -    { -      ptr += -        sprintf (ptr, ", On %d.%d", status.cd_edge_sec / 60, -                 status.cd_edge_sec % 60); -    } -  else -    { -      ptr += -        sprintf (ptr, ", Off %d.%d", status.cd_edge_sec / 60, -                 status.cd_edge_sec % 60); -    } +  if (status.lines & TIOCM_CD) { +    ptr += +      sprintf (ptr, ", On %d.%d", status.cd_edge_sec / 60, +               status.cd_edge_sec % 60); +  } else { +    ptr += +      sprintf (ptr, ", Off %d.%d", status.cd_edge_sec / 60, +               status.cd_edge_sec % 60); +  }  #endif    ptr +=      sprintf (ptr, ", %d client%s", status.nclients,               (status.nclients == 1) ? "" : "s"); -  if (c->tp->biterrs) -    { +  if (c->tp->biterrs) { -      ptr += -        sprintf (ptr, ", %d err%s", c->tp->biterrs, -                 (c->tp->biterrs == 1) ? "" : "s"); +    ptr += +      sprintf (ptr, ", %d err%s", c->tp->biterrs, +               (c->tp->biterrs == 1) ? "" : "s"); -      if (c->tp->guessed_baud == -1) -        { -          ptr += sprintf (ptr, " try higher"); -        } -      else if (c->tp->guessed_baud > 0) -        { -          ptr += sprintf (ptr, " try %db", c->tp->guessed_baud); -        } +    if (c->tp->guessed_baud == -1) { +      ptr += sprintf (ptr, " try higher"); +    } else if (c->tp->guessed_baud > 0) { +      ptr += sprintf (ptr, " try %db", c->tp->guessed_baud);      } +  }    *ptr = 0; @@ -373,38 +361,36 @@ check_status (Context * c, Clients * cs)  static int  msg_from_server (ANSI * a, IPC_Msg * m, Context * c)  { -  switch (m->hdr.type) -    { +  switch (m->hdr.type) { -    case IPC_MSG_TYPE_NOOP: -      break; -    case IPC_MSG_TYPE_DEBUG: +  case IPC_MSG_TYPE_NOOP: +    break; +  case IPC_MSG_TYPE_DEBUG:  //          fprintf (stderr,"%p [%d] %s\n", m, m->hdr.size , m->debug.msg ); -      break; -    case IPC_MSG_TYPE_HISTORY: -      history_add (c->h, m->history.history.line); -      break; -    case IPC_MSG_TYPE_VT102: -      if (sizeof (VT102) != m->vt102.len) -        abort (); - -      *(c->v) = m->vt102.vt102; - -      if (a->one_shot) -        { -          a->one_shot (a, &c->v->crt); -          return 1; -        } -      break; -    case IPC_MSG_TYPE_TERM: -      tty_parse (c, m->term.term, m->term.len); -      break; -    case IPC_MSG_TYPE_STATUS: -      cmd_new_status (c->d, c, m->status.status); -      break; -    default: -      fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type); +    break; +  case IPC_MSG_TYPE_HISTORY: +    history_add (c->h, m->history.history.line); +    break; +  case IPC_MSG_TYPE_VT102: +    if (sizeof (VT102) != m->vt102.len) +      abort (); + +    *(c->v) = m->vt102.vt102; + +    if (a->one_shot) { +      a->one_shot (a, &c->v->crt); +      return 1;      } +    break; +  case IPC_MSG_TYPE_TERM: +    tty_parse (c, m->term.term, m->term.len); +    break; +  case IPC_MSG_TYPE_STATUS: +    cmd_new_status (c->d, c, m->status.status); +    break; +  default: +    fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type); +  }    return 0;  } @@ -426,149 +412,130 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket,    c.h = history_new (nhistory);    c.l = log;    /* are we being fed by a tty or a socket */ -  if (client_socket) -    { -      if (server_socket) -        abort (); -      c.k = keydis_ipc_new (client_socket); -    } -  else -    { -      if (!tty) -        abort (); -      c.t = tty; -      c.k = keydis_vt102_new (); -    } +  if (client_socket) { +    if (server_socket) +      abort (); +    c.k = keydis_ipc_new (client_socket); +  } else { +    if (!tty) +      abort (); +    c.t = tty; +    c.k = keydis_vt102_new (); +  }    /* do we have an upstream terminal to talk to */    /* if so start a command parser */ -  if (ansi) -    { -      c.d = cmd_new (); -    } -  else -    { -      c.d = NULL; -    } +  if (ansi) { +    c.d = cmd_new (); +  } else { +    c.d = NULL; +  }    vt102_reset (&c); -  if (server_socket) -    { -      if (client_socket) -        abort (); -      clients = clients_new (); -    } -  else -    { -      clients = NULL; -    } +  if (server_socket) { +    if (client_socket) +      abort (); +    clients = clients_new (); +  } else { +    clients = NULL; +  } -  for (;;) -    { -      struct timeval tv = { 0, 250000 }; +  for (;;) { +    struct timeval tv = { 0, 250000 }; -      if ((c.d) && (c.d->disconnect)) -        break; +    if ((c.d) && (c.d->disconnect)) +      break; -      /*update the status lines, locally or remotely */ -      if (c.t) -        check_status (&c, clients); +    /*update the status lines, locally or remotely */ +    if (c.t) +      check_status (&c, clients); -      FD_ZERO (&rfds); -      FD_ZERO (&wfds); +    FD_ZERO (&rfds); +    FD_ZERO (&wfds); -      if (c.t) -        tty_pre_select (c.t, &rfds, &wfds); +    if (c.t) +      tty_pre_select (c.t, &rfds, &wfds); -      if (server_socket) -        { -          FD_SET (server_socket->fd, &rfds); -          clients_pre_select (clients, &rfds, &wfds); -        } +    if (server_socket) { +      FD_SET (server_socket->fd, &rfds); +      clients_pre_select (clients, &rfds, &wfds); +    } -      if (client_socket) -        socket_pre_select (client_socket, &rfds, &wfds); +    if (client_socket) +      socket_pre_select (client_socket, &rfds, &wfds); -      if (ansi && ansi->terminal) -        tty_pre_select (ansi->terminal, &rfds, &wfds); +    if (ansi && ansi->terminal) +      tty_pre_select (ansi->terminal, &rfds, &wfds); -      select (FD_SETSIZE, &rfds, &wfds, NULL, &tv); +    select (FD_SETSIZE, &rfds, &wfds, NULL, &tv); -      /*any message from clients, or new connexions */ -      if (server_socket) +    /*any message from clients, or new connexions */ +    if (server_socket) { +      Socket *new_client_socket; +      if (FD_ISSET (server_socket->fd, &rfds) +          && ((new_client_socket = socket_accept (server_socket)))) {          { -          Socket *new_client_socket; -          if (FD_ISSET (server_socket->fd, &rfds) -              && ((new_client_socket = socket_accept (server_socket)))) -            { -              { -                Client *new_client; -                /*New client connexion */ -                new_client = -                  clients_new_client (clients, new_client_socket, &c); - -                send_history (c.h, new_client); -                send_vt102 (c.v, new_client); - -              } -            } - -          clients_post_select (clients, &c, &rfds, &wfds); +          Client *new_client; +          /*New client connexion */ +          new_client = clients_new_client (clients, new_client_socket, &c); + +          send_history (c.h, new_client); +          send_vt102 (c.v, new_client); +          } +      } -      /*any data from the port */ -      if (c.t && FD_ISSET (c.t->rfd, &rfds)) -        { -          char buf[IPC_MAX_BUF]; -          int red; +      clients_post_select (clients, &c, &rfds, &wfds); +    } -          red = c.t->recv (c.t, buf, sizeof (buf)); +    /*any data from the port */ +    if (c.t && FD_ISSET (c.t->rfd, &rfds)) { +      char buf[IPC_MAX_BUF]; +      int red; -          if (red < 0) -            break; +      red = c.t->recv (c.t, buf, sizeof (buf)); -          if (red) -            { -              if (clients) -                send_output (clients, buf, red); -              tty_parse (&c, buf, red); -            } -        } +      if (red < 0) +        break; +      if (red) { +        if (clients) +          send_output (clients, buf, red); +        tty_parse (&c, buf, red); +      } +    } -      /*any data from the server */ -      if (client_socket) -        { -          int one_shot; -          if (socket_post_select (client_socket, &rfds, &wfds)) -            break; - -          while (client_socket->msg) -            { -              if (msg_from_server (ansi, client_socket->msg, &c)) -                one_shot++; - -              socket_consume_msg (client_socket); -            } -          if (one_shot) -            break; -        } +    /*any data from the server */ +    if (client_socket) { +      int one_shot; +      if (socket_post_select (client_socket, &rfds, &wfds)) +        break; -      /*update our local screen */ -      if (ansi) -        { -          if (ansi->dispatch) -            ansi->dispatch (ansi, &c); +      while (client_socket->msg) { +        if (msg_from_server (ansi, client_socket->msg, &c)) +          one_shot++; -          if (ansi->update) -            ansi->update (ansi, &c); -        } +        socket_consume_msg (client_socket); +      } +      if (one_shot) +        break; +    } + + +    /*update our local screen */ +    if (ansi) { +      if (ansi->dispatch) +        ansi->dispatch (ansi, &c); + +      if (ansi->update) +        ansi->update (ansi, &c);      } +  }    if (clients)      clients_shutdown (clients); diff --git a/apps/mainloop.h b/apps/mainloop.h index df32f25..760cd9f 100644 --- a/apps/mainloop.h +++ b/apps/mainloop.h @@ -12,6 +12,9 @@  /*   * $Log$ + * Revision 1.6  2008/03/02 10:27:24  james + * *** empty log message *** + *   * Revision 1.5  2008/02/27 09:42:53  james   * *** empty log message ***   * @@ -35,7 +38,7 @@  #include <sympathy.h>  extern void -mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, ANSI * a, -          Log * log, int nhistory, CRT_Pos * size); +  mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, ANSI * a, +            Log * log, int nhistory, CRT_Pos * size);  #endif /* __MAINLOOP_H__ */ diff --git a/apps/sympathy.c b/apps/sympathy.c index 41d0bbb..e1ed6e6 100644 --- a/apps/sympathy.c +++ b/apps/sympathy.c @@ -11,6 +11,9 @@ static char rcsid[] =  /*   * $Log$ + * Revision 1.28  2008/03/02 10:27:24  james + * *** empty log message *** + *   * Revision 1.27  2008/03/02 09:55:37  james   * *** empty log message ***   * @@ -112,7 +115,7 @@ extern void usage (void);  static char hostname[1024];  char *socket_dirs[] = -  { ".sympathy", "sympathy", "/etc/sympathy", "/var/sympathy", NULL }; +  { "~/.sympathy", "~/sympathy", "/etc/sympathy", "/var/sympathy", NULL };  int  safe_atoi (char *a) @@ -146,60 +149,36 @@ fatal_moan (char *fmt, ...)  } - -/*make the path in fmt from home (hence the name) */ -  char * -mome (char *fmt, ...) +teedious_snprint (char *fmt, va_alist * ap)  { - -  int n; -  int homelen; -  char *buf, *home; -  va_list ap; -  int size; - - -  home = getenv ("HOME"); -  if (!home) -    return NULL; - -  homelen = strlen (home) + 1; - -  size = 1024 + homelen; - -  buf = malloc (size); +  va_alist *aq; +  int size = 1024; +  char *buf = malloc (size);    if (!buf)      fatal_moan ("malloc failed"); -  strcpy (buf, home); -  strcat (buf, "/"); +  while (1) { -  if (!fmt) -    return buf; +    va_copy (aq, ap); +    n = vsnprintf (buf, size, fmt, aq); +    va_end (aq); -  while (1) -    { +    if (n > -1 && n < (size)) +      return buf; +    if (n > -1)                 /* glibc 2.1 */ +      size = n + 1; +    else                        /* glibc 2.0 */ +      size *= 2;                /* twice the old size */ -      va_start (ap, fmt); -      n = vsnprintf (buf + homelen, size - homelen, fmt, ap); -      va_end (ap); +    buf = realloc (buf, size); -      if (n > -1 && n < (size - homelen)) -        return buf; - -      if (n > -1)               /* glibc 2.1 */ -        size = homelen + n + 1; -      else                      /* glibc 2.0 */ -        size *= 2;              /* twice the old size */ - -      buf = realloc (buf, size); +    if (!buf) +      fatal_moan ("malloc failed"); +  } -      if (!buf) -        fatal_moan ("malloc failed"); -    }  }  char * @@ -207,6 +186,10 @@ gloo_paths (char *dir, char *leaf)  {    int i;    char *ret, *ptr; +  if (!dir) +    dir = ""; +  if (!leaf) +    leaf = "";    ret = ptr = malloc (strlen (dir) + strlen (leaf) + 2);    while (*dir) @@ -220,6 +203,84 @@ gloo_paths (char *dir, char *leaf)  } +/*make the path in fmt from home (hence the name) */ +char * +mome (char *fmt, ...) +{ + +  char *rt, *home, *leaf; +  va_list ap; + + +  home = getenv ("HOME"); +  if (!home) +    return NULL; + +  if (fmt) { +    va_start (ap, fmt); +    leaf = teedious_snprintf (fmt, ap); +    va_end (ap); +  } else { +    leaf = NULL; +  } + +  ret = gloo_paths (home, leaf); +  if (leaf) +    free (leaf); + +  return ret; +} + + +char * +find_socket (char *fmt, ...) +{ +  Socket *ret; +  char *path, *leaf, *h, **ptr; +  va_list ap; + + +  if (fmt) { +    va_start (ap, fmt); +    leaf = teedious_snprintf (fmt, ap); +    va_end (ap); +  } else { +    leaf = NULL; +  } + + +  for (ptr = socket_dirs; *ptr; ptr++) { +    if (**ptr == '~') { +      h = mome (*ptr + 1); +    } else { +      h = *ptr; +    } + +    if (!h) +      continue; + + +    path = gloo_paths (h, leaf); +    if (**ptr == '~') +      free (h); + +    ret = socket_connect (path); + +    free (path); + +    if (ret) { +      free (leaf); +      return ret; +    } + +  } + +  free (leaf); +  return NULL; + +} + +  int  list_sockets_in_dir (char *sockdir) @@ -240,38 +301,30 @@ list_sockets_in_dir (char *sockdir)    rewinddir (dir); -  while ((ent = readdir (dir))) -    { -      sn = gloo_paths (sockdir, ent->d_name); -      if (stat (sn, &buf) || (!S_ISSOCK (buf.st_mode))) -        { -          free (sn); -          continue; -        } - -      s = socket_connect (sn); - -      if (s) -        { -          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", sn); -            } -          else -            { -              printf ("\t%s	(Dead, wiped)\n", sn); -              unlink (sn); -            } -        } - +  while ((ent = readdir (dir))) { +    sn = gloo_paths (sockdir, ent->d_name); +    if (stat (sn, &buf) || (!S_ISSOCK (buf.st_mode))) {        free (sn); +      continue; +    } + +    s = socket_connect (sn); + +    if (s) { +      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", sn); +      } else { +        printf ("\t%s	(Dead, wiped)\n", sn); +        unlink (sn); +      }      } +    free (sn); +  } +    closedir (dir);    return 0; @@ -283,17 +336,19 @@ list_sockets (void)    char **ptr, *h; -  for (ptr = socket_dirs; *ptr; ptr++) -    { -      h = mome (*ptr); +  for (ptr = socket_dirs; *ptr; ptr++) { +    if (*ptr == '~') { +      h = mome (ptr + 1); +    } else { +      h = strdup (*ptr); +    } -      if (h) -        { -          list_sockets_in_dir (h); -          free (h); -        } +    if (!h) +      continue; +    list_sockets_in_dir (h); +    free (h); -    } +  }    return 0;  } @@ -304,11 +359,10 @@ get_hostname (void)  {    struct utsname name; -  if (uname (&name)) -    { -      strcpy (hostname, "unknown."); -      return; -    } +  if (uname (&name)) { +    strcpy (hostname, "unknown."); +    return; +  }    strcpy (hostname, name.nodename); @@ -342,34 +396,27 @@ main (int argc, char *argv[])    memset (oflags, 0, sizeof (oflags));    memset (oargs, 0, sizeof (oargs)); -  while ((c = getopt (argc, argv, "vw:utscr:lKHd:pb:fL:Fk:n:")) != EOF) -    { -      switch (c) -        { -        case ':': -        case 'h': -        case '?': -          usage (); -        default: -          if ((c > 64) && (c < 91)) -            { -              oflags[c]++; -              oargs[c] = optarg; -            } -          else if ((c > 96) && (c < 123)) -            { -              oflags[c]++; -              oargs[c] = optarg; -            } -          else -            { -              fprintf (stderr, "unknown option %c\n", c); -              usage (); -            } -        } - +  while ((c = getopt (argc, argv, "vw:utscr:lKHd:pb:fL:Fk:n:")) != EOF) { +    switch (c) { +    case ':': +    case 'h': +    case '?': +      usage (); +    default: +      if ((c > 64) && (c < 91)) { +        oflags[c]++; +        oargs[c] = optarg; +      } else if ((c > 96) && (c < 123)) { +        oflags[c]++; +        oargs[c] = optarg; +      } else { +        fprintf (stderr, "unknown option %c\n", c); +        usage (); +      }      } +  } +    /*Compatability for screen's ls */    if (oflags['l'])      oflags['s'] = 0; @@ -383,25 +430,23 @@ main (int argc, char *argv[])      sum += oflags['l'];      sum += oflags['v']; -    if (!sum) -      { -        /*If no mode is specified behave like screen */ -        oflags['s']++; -        oflags['c']++; -        sum++; -      } +    if (!sum) { +      /*If no mode is specified behave like screen */ +      oflags['s']++; +      oflags['c']++; +      sum++; +    }      if (sum != 1)        fatal_moan          ("specifiy exactly one of ( -c and or -s ), -t, -r, -l and -v");    } -  if (oflags['v']) -    { -      fprintf (stderr, "Version: %s\n", libsympathy_version ()); -      fprintf (stderr, "Version: %s\n", rcsid); -      return 0; -    } +  if (oflags['v']) { +    fprintf (stderr, "Version: %s\n", libsympathy_version ()); +    fprintf (stderr, "Version: %s\n", rcsid); +    return 0; +  }    if (oflags['l'])      return list_sockets (); @@ -411,15 +456,14 @@ main (int argc, char *argv[])      fatal_moan ("-k is incompatible with -r"); -  if (oflags['n']) -    { -      history = safe_atoi (oargs['n']); -      if (history < 0) -        fatal_moan ("cannot parse -n %s as an integer", oargs['n']); +  if (oflags['n']) { +    history = safe_atoi (oargs['n']); +    if (history < 0) +      fatal_moan ("cannot parse -n %s as an integer", oargs['n']); -      if (!history) -        fatal_moan ("agrument to -n must be greater than zero"); -    } +    if (!history) +      fatal_moan ("agrument to -n must be greater than zero"); +  }    /*Fold -r implies -c */    if (oflags['r']) @@ -437,59 +481,55 @@ main (int argc, char *argv[])    /*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']) -    { -      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:               /*parent becomes client */ -          oflags['s'] = 0; -          oflags['K'] = 0; -          oflags['d'] = 0; -          oflags['p'] = 0; -          oflags['b'] = 0; -          oflags['f'] = 0; -          oflags['L'] = 0; -          oflags['n'] = 0; -          oflags['w'] = 0; - -          /*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) -            { -              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['s'] && oflags['c']) { +    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:                   /*parent becomes client */ +      oflags['s'] = 0; +      oflags['K'] = 0; +      oflags['d'] = 0; +      oflags['p'] = 0; +      oflags['b'] = 0; +      oflags['f'] = 0; +      oflags['L'] = 0; +      oflags['n'] = 0; +      oflags['w'] = 0; + +      /*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) { +        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'] && !oflags['r'])      fatal_moan ("-c requires a socket to be specified with -s or -k or -r"); @@ -498,196 +538,168 @@ main (int argc, char *argv[])         || oflags['L']) && oflags['c'])      fatal_moan ("-c or -r are incompatible with -p, -d, -K, -b, -f or -L"); -  if (oflags['t'] || oflags['s']) -    { -      if (!oflags['p'] && !oflags['d']) -        oflags['p']++; -    } - -  if (oflags['w']) -    { -      char buf[128], *ptr; -      strcpy (buf, oargs['w']); -      ptr = index (buf, 'x'); -      if (ptr) -        { -          *ptr = 0; -          ptr++; -          size.y = safe_atoi (ptr); -        } -      size.x = safe_atoi (buf); - -      if ((size.x > VT102_MAX_COLS) || (size.x < 1)) -        fatal_moan ("-w requires a width between 1 and %d\n", VT102_MAX_COLS); - -      if ((size.y > VT102_MAX_ROWS) || (size.y < 1)) -        fatal_moan ("-w requires a height between 1 and %d\n", -                    VT102_MAX_ROWS); +  if (oflags['t'] || oflags['s']) { +    if (!oflags['p'] && !oflags['d']) +      oflags['p']++; +  } +  if (oflags['w']) { +    char buf[128], *ptr; +    strcpy (buf, oargs['w']); +    ptr = index (buf, 'x'); +    if (ptr) { +      *ptr = 0; +      ptr++; +      size.y = safe_atoi (ptr);      } +    size.x = safe_atoi (buf); -  if (oflags['s'] && !oflags['F']) -    { -      /*nochdir incase socket is relative path, unlink then will fail */ -      daemon (1, 0); +    if ((size.x > VT102_MAX_COLS) || (size.x < 1)) +      fatal_moan ("-w requires a width between 1 and %d\n", VT102_MAX_COLS); -    } +    if ((size.y > VT102_MAX_ROWS) || (size.y < 1)) +      fatal_moan ("-w requires a height between 1 and %d\n", VT102_MAX_ROWS); + +  } +  if (oflags['s'] && !oflags['F']) { +    /*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 (); +  if (oflags['s']) { +    char *path; +    path = mome ("/.sympathy"); +    mkdir (path, 0700); +    free (path); -          oargs['k'] = mome ("/.sympathy/%s%d", hostname, pid); -          oflags['k']++; -        } -      server_socket = socket_listen (oargs['k']); +    if (!oflags['k']) { +      pid = getpid (); -      /*Tell our parent's parent what our pid is */ -      if (csnok) -        { -          pid = getpid (); +      oargs['k'] = mome ("/.sympathy/%s%d", hostname, pid); +      oflags['k']++; +    } -          write (csnok_pipe[1], &pid, sizeof (pid)); -          close (csnok_pipe[1]); -        } +    server_socket = socket_listen (oargs['k']); -      if (!server_socket) -        fatal_moan ("failed to create socket %s for listening", 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 (oflags['s'] || oflags['t']) -    { +    if (!server_socket) +      fatal_moan ("failed to create socket %s for listening", oargs['k']); -      if (oflags['L']) -        { -          log = file_log_new (oargs['L']); -          if (!log) -            fatal_moan ("unable to access log file %s", oargs['L']); -        } +  } -      if (oflags['p']) -        { -          tty = ptty_open (NULL, NULL, &size); -          if (!tty) -            fatal_moan ("unable to open a ptty"); -        } -      else -        { -          /*HACK-- check that console=device does not occur in */ -          /*/proc/cmdline */ -          if (!oargs['d']) -            fatal_moan ("no argument to -d"); +  if (oflags['s'] || oflags['t']) { -          { -            char kernel_cmdline[4096] = { 0 }; -            char search_string[1024] = "console="; -            char *ptr = oargs['d']; -            int fd; +    if (oflags['L']) { +      log = file_log_new (oargs['L']); +      if (!log) +        fatal_moan ("unable to access log file %s", oargs['L']); +    } -            if (!strncmp ("/dev/", ptr, 5)) -              ptr += 5; +    if (oflags['p']) { +      tty = ptty_open (NULL, NULL, &size); +      if (!tty) +        fatal_moan ("unable to open a ptty"); +    } else { +      /*HACK-- check that console=device does not occur in */ +      /*/proc/cmdline */ +      if (!oargs['d']) +        fatal_moan ("no argument to -d"); -            strcat (search_string, ptr); +      { +        char kernel_cmdline[4096] = { 0 }; +        char search_string[1024] = "console="; +        char *ptr = oargs['d']; +        int fd; -            fd = open ("/proc/cmdline", O_RDONLY); -            read (fd, kernel_cmdline, sizeof (kernel_cmdline)); -            close (fd); +        if (!strncmp ("/dev/", ptr, 5)) +          ptr += 5; -            kernel_cmdline[sizeof (kernel_cmdline) - 1] = 0; +        strcat (search_string, ptr); -            if (strstr (kernel_cmdline, search_string)) -              fatal_moan ("/proc/cmdline contains %s", search_string); -          } +        fd = open ("/proc/cmdline", O_RDONLY); +        read (fd, kernel_cmdline, sizeof (kernel_cmdline)); +        close (fd); -          tty = -            serial_open (oargs['d'], -                         oflags['K'] ? SERIAL_LOCK_ACTIVE : -                         SERIAL_LOCK_PASSIVE); -          if (!tty) -            fatal_moan ("unable to open serial port %s", oargs['d']); -        } +        kernel_cmdline[sizeof (kernel_cmdline) - 1] = 0; -      if (oflags['b']) -        { -          int baud = safe_atoi (oargs['b']); +        if (strstr (kernel_cmdline, search_string)) +          fatal_moan ("/proc/cmdline contains %s", search_string); +      } -          if (baud < 0) -            fatal_moan ("Unable to parse baudrate %s", oargs['b']); +      tty = +        serial_open (oargs['d'], +                     oflags['K'] ? SERIAL_LOCK_ACTIVE : SERIAL_LOCK_PASSIVE); +      if (!tty) +        fatal_moan ("unable to open serial port %s", oargs['d']); +    } -          tty_set_baud (tty, baud); +    if (oflags['b']) { +      int baud = safe_atoi (oargs['b']); -        } +      if (baud < 0) +        fatal_moan ("Unable to parse baudrate %s", oargs['b']); -      tty_set_flow (tty, oflags['f'] ? 1 : 0); +      tty_set_baud (tty, baud);      } +    tty_set_flow (tty, oflags['f'] ? 1 : 0); +  } -  FISH -  { + +  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'] = find_socket ("%s%d", hostname, safe_atoi (id)); -      } -    else -      { -        oargs['k'] = find_socket ("%s", id); -      } -    oflags['r'] = 0; -    oflags['c']++; -  } +    if (!id) +      fatal_moan ("-r requires an argument"); -  if (oflags['c']) -    { +    if (safe_atoi (id) > 0) { +      client_socket = find_socket ("%s%d", hostname, safe_atoi (id)); +    } else { +      client_socket = find_socket ("%s", id); +    } -      client_socket = socket_connect (oargs['k']); -      if (!client_socket) -        fatal_moan ("failed to connect to socket %s", oargs['k']); +    if (!client_socket) +      fatal_moan ("failed to find socket %s", oargs['r']); +  } else if (oflags['c']) { +    client_socket = socket_connect (oargs['k']); + +    if (!client_socket) +      fatal_moan ("failed to connect to socket %s", oargs['k']); + +  } -    } +  if (oflags['c'] || oflags['t']) { -  if (oflags['c'] || oflags['t']) -    { - -      if (oflags['H']) -        { -          ansi = ansi_new_html (stdout); -        } -      else -        { -          terminal_register_handlers (); -          ansi = -            ansi_new_from_terminal (terminal_open (0, 1), -                                    oflags['u'] ? 0 : 1); -          ansi->reset (ansi, NULL); -        } +    if (oflags['H']) { +      ansi = ansi_new_html (stdout); +    } else { +      terminal_register_handlers (); +      ansi = +        ansi_new_from_terminal (terminal_open (0, 1), oflags['u'] ? 0 : 1); +      ansi->reset (ansi, NULL);      } +  }    mainloop (tty, server_socket, client_socket, ansi, log, history, &size); -  if (ansi) -    { -      ansi->close (ansi); -      terminal_atexit (); -    } +  if (ansi) { +    ansi->close (ansi); +    terminal_atexit (); +  }    if (tty)      tty->close (tty); @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$";  /*   * $Log$ + * Revision 1.38  2008/03/02 10:27:24  james + * *** empty log message *** + *   * Revision 1.37  2008/02/29 22:50:29  james   * *** empty log message ***   * @@ -745,7 +748,7 @@ int ansi_key(ANSI *a,Context *c,int key)    if (c->d->active) { -  	if (key == CMD_KEY) +  	if (key == CMD_KEY) {      return cmd_deactivate (c->d, c);  	}else {      return cmd_key (c->d, c,a, key); | 
