[BACK]Return to oxc.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / oxc

Diff for /OpenXM/src/oxc/oxc.c between version 1.14 and 1.15.2.1

version 1.14, 2005/07/28 07:22:33 version 1.15.2.1, 2005/10/12 10:43:32
Line 1 
Line 1 
 /* -*- mode: C -*- */  /* -*- mode: C -*- */
 /* $OpenXM: OpenXM/src/oxc/oxc.c,v 1.13 2004/12/01 17:42:46 ohara Exp $ */  /* $OpenXM: OpenXM/src/oxc/oxc.c,v 1.15 2005/10/12 10:37:24 takayama Exp $ */
   
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
Line 17  static char *password = "";
Line 17  static char *password = "";
   
 int oxf_connect_dup(char *remote, short port)  int oxf_connect_dup(char *remote, short port)
 {  {
     int fd = mysocketOpen(remote, port);    int fd = mysocketOpen(remote, port);
     /* Here do we need to confirm? */    /* Here do we need to confirm? */
     dup2(fd, 3);    dup2(fd, 3);
     dup2(fd, 4); /* is it necessary? maybe fd == 4. */    dup2(fd, 4); /* is it necessary? maybe fd == 4. */
     return fd;    return fd;
 }  }
   
 int lf_oxc_open_main(char *cmd, short port)  int lf_oxc_open_main(char *cmd, short port)
 {  {
     pid_t pid;    pid_t pid;
     if ((pid = fork()) == 0) {    if ((pid = fork()) == 0) {
         oxf_connect_dup(remote_host, port);      oxf_connect_dup(remote_host, port);
         ox_printf("oxc: oxc_open(%s, %d)\n", cmd, port);      ox_printf("oxc: oxc_open(%s, %d)\n", cmd, port);
         execlp(cmd, cmd, NULL);      execlp(cmd, cmd, NULL);
     }    }
     return pid; /* if error, pid == 0 */    return pid; /* if error, pid == 0 */
 }  }
   
 #define MAX_RETRY  2000  #define MAX_RETRY  2000
   
 OXFILE *connection()  OXFILE *connection()
 {  {
     OXFILE *oxfp;    OXFILE *oxfp;
     int counter = MAX_RETRY;    int counter = MAX_RETRY;
     while((oxfp = oxf_connect_active(remote_host, port)) == NULL) {    while((oxfp = oxf_connect_active(remote_host, port)) == NULL) {
         if (--counter > 0) {      if (--counter > 0) {
             usleep(100); /* spends 100 micro seconds */        usleep(100); /* spends 100 micro seconds */
         }else {      }else {
             ox_printf("oxc: cannot connect.\n");        ox_printf("oxc: cannot connect.\n");
             return NULL;        return NULL;
         }  
     }      }
     oxf_confirm_server(oxfp, password);    }
     oxf_determine_byteorder_server(oxfp);    oxf_confirm_server(oxfp, password);
     return oxfp;    oxf_determine_byteorder_server(oxfp);
     return oxfp;
 }  }
   
 __inline__  __inline__
 static char *sskip(char *s)  static char *sskip(char *s)
 {  {
     while (isspace(*s)) {    while (isspace(*s)) {
         s++;      s++;
     }    }
     return s;    return s;
 }  }
   
 __inline__  __inline__
 static char *wskip(char *s)  static char *wskip(char *s)
 {  {
     while (!isspace(*s) && *s != '\0') {    while (!isspace(*s) && *s != '\0') {
         s++;      s++;
     }    }
     return s;    return s;
 }  }
   
 static int wc(char *s)  static int wc(char *s)
 {  {
     int n = 0;    int n = 0;
     s = sskip(s);
     while(*s != '\0') {
       s = wskip(s);
     s = sskip(s);      s = sskip(s);
     while(*s != '\0') {      n++;
         s = wskip(s);    }
         s = sskip(s);    return n;
         n++;  
     }  
     return n;  
 }  }
   
 static void word(char *str, int argc, char *argv[])  static void word(char *str, int argc, char *argv[])
 {  {
     int i;    int i;
     char *s = strcpy(malloc(strlen(str)+1), str);    char *s = strcpy(malloc(strlen(str)+1), str);
     for(i=0; i<argc; i++) {    for(i=0; i<argc; i++) {
         s = sskip(s);      s = sskip(s);
         argv[i] = s;      argv[i] = s;
         s = wskip(s);      s = wskip(s);
         *s++ = '\0';      *s++ = '\0';
     }    }
     argv[i] = NULL;    argv[i] = NULL;
 }  }
   
 __inline__  __inline__
 static int arglen(char *args[])  static int arglen(char *args[])
 {  {
     int len;    int len;
     for(len = 0; args[len] != NULL; len++) {    for(len = 0; args[len] != NULL; len++) {
         ;      ;
     }    }
     return len;    return len;
 }  }
   
 /* xterm, kterm, rxvt, gnome-terminal, ... */  /* xterm, kterm, rxvt, gnome-terminal, ... */
 static char **makeargs(char **oldargs)  static char **makeargs(char **oldargs)
 {  {
     char *e = getenv("OpenXM_XTERM");    char *e = getenv("OpenXM_XTERM");
     int argc;    int argc;
     char **newargs;    char **newargs;
     int len = arglen(oldargs);    int len = arglen(oldargs);
     if (e == NULL) {    if (e == NULL) {
         argc = 1;      argc = 1;
         newargs = malloc((len+1+argc)*sizeof(char *));      newargs = malloc((len+1+argc)*sizeof(char *));
         newargs[0] = "xterm";      newargs[0] = "xterm";
     }else {    }else {
         argc = wc(e);      argc = wc(e);
         newargs = malloc((len+1+argc)*sizeof(char *));      newargs = malloc((len+1+argc)*sizeof(char *));
         word(e, argc, newargs);      word(e, argc, newargs);
     }    }
     memcpy(newargs+argc, oldargs, (len+1)*sizeof(char *));    memcpy(newargs+argc, oldargs, (len+1)*sizeof(char *));
     return newargs;    return newargs;
 }  }
   
 /* We assume that data has the following format:  /* We assume that data has the following format:
Line 137  void pipe_read_info(char **hostname, int *port, char *
Line 137  void pipe_read_info(char **hostname, int *port, char *
   
 int main(int argc, char *argv[])  int main(int argc, char *argv[])
 {  {
     OXFILE *oxfp;    OXFILE *oxfp;
     char *port_s = "";    char *port_s = "";
     char *myname = argv[0];    char *myname = argv[0];
     int oxlog = 0;    int oxlog = 0;
     int c;    int c;
     int delay = 0;    int delay = 0;
     char *delay_s = "0";    char *delay_s = "0";
         int quiet = 0;    int quiet = 0;
   
     while ((c = getopt(argc, argv, "c:d:h:p:qx")) != -1) {    while ((c = getopt(argc, argv, "c:d:h:p:qx")) != -1) {
         switch(c) {      switch(c) {
         case 'h':      case 'h':
             remote_host = optarg;        remote_host = optarg;
             break;        break;
         case 'c':      case 'c':
             password = optarg;        password = optarg;
             break;        break;
         case 'p':      case 'p':
             port = atoi(optarg);        port = atoi(optarg);
             port_s = optarg;        port_s = optarg;
             break;        break;
         case 'q':      case 'q':
             quiet = 1;        quiet = 1;
             break;        break;
         case 'x':      case 'x':
             if (getenv("DISPLAY") != NULL) {        if (getenv("DISPLAY") != NULL) {
                 oxlog = 1;          oxlog = 1;
             }        }
             break;        break;
         case 'd':      case 'd':
             delay_s = optarg;        delay_s = optarg;
             delay = atoi(optarg);        delay = atoi(optarg);
             break;        break;
         default:      default:
             ;        ;
         }  
     }      }
     argc -= optind;    }
     argv += optind;    argc -= optind;
     argv += optind;
   
     if (!quiet) {    if (!quiet) {
         ox_stderr_init(stderr);      ox_stderr_init(stderr);
         }    }
   
     if (strlen(remote_host) == 0) {    if (strlen(remote_host) == 0) {
         pipe_read_info(&remote_host, &port, &password);      pipe_read_info(&remote_host, &port, &password);
         port_s = malloc(32);      port_s = malloc(32);
         sprintf(port_s, "%d", port);      sprintf(port_s, "%d", port);
     }    }
     if (oxlog) {    if (oxlog) {
         char *common_args[] = {"-e", myname, "-d", delay_s,      char *common_args[] = {"-e", myname, "-d", delay_s,
                           "-h", remote_host, "-p", port_s, "-c",                             "-h", remote_host, "-p", port_s, "-c",
                           password, NULL};                             password, NULL};
         char **args = makeargs(common_args);      char **args = makeargs(common_args);
         execvp(args[0], args);      execvp(args[0], args);
     }    }
   
     ox_printf("start connection!\n");    ox_printf("start connection!\n");
     usleep(delay);    usleep(delay);
     if ((oxfp = connection()) != NULL) {    if ((oxfp = connection()) != NULL) {
         ox_printf("oxc: oxfp = %p, fd = %d\n", oxfp, oxfp->fd);      ox_printf("oxc: oxfp = %p, fd = %d\n", oxfp, oxfp->fd);
         mathcap_init("v2000.10.06", "oxc");      mathcap_init("v2000.10.06", "oxc");
         sm(oxfp);      sm(oxfp);
     }    }
     return 0;    return 0;
 }  }

Legend:
Removed from v.1.14  
changed lines
  Added in v.1.15.2.1

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>