[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.5 and 1.14

version 1.5, 2000/12/01 07:34:48 version 1.14, 2005/07/28 07:22:33
Line 1 
Line 1 
 /* -*- mode: C -*- */  /* -*- mode: C -*- */
 /* $OpenXM: OpenXM/src/oxc/oxc.c,v 1.4 2000/11/28 04:02:56 ohara Exp $ */  /* $OpenXM: OpenXM/src/oxc/oxc.c,v 1.13 2004/12/01 17:42:46 ohara Exp $ */
   
 #include <stdio.h>  #include <stdio.h>
 #include <stdlib.h>  #include <stdlib.h>
 #include <unistd.h>  #include <unistd.h>
   #include <ctype.h>
 #include <string.h>  #include <string.h>
 #include "mysocket.h"  #include "mysocket.h"
 #include "ox_toolkit.h"  #include "ox_toolkit.h"
Line 25  int oxf_connect_dup(char *remote, short port)
Line 26  int oxf_connect_dup(char *remote, short port)
   
 int lf_oxc_open_main(char *cmd, short port)  int lf_oxc_open_main(char *cmd, short port)
 {  {
     int pid = 0;      pid_t pid;
     if (cmd != NULL && (pid = fork()) == 0) {      if ((pid = fork()) == 0) {
         oxf_connect_dup(remote_host, port);          oxf_connect_dup(remote_host, port);
         fprintf(stderr, "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);
     }      }
     fprintf(stderr, "oxc: cannnot oxc_open(%s, %d).\n", cmd, port);  
     return pid; /* if error, pid == 0 */      return pid; /* if error, pid == 0 */
 }  }
   
   #define MAX_RETRY  2000
   
 OXFILE *connection()  OXFILE *connection()
 {  {
     OXFILE *oxfp = oxf_connect_active(remote_host, port);      OXFILE *oxfp;
     if (oxfp != NULL) {      int counter = MAX_RETRY;
         oxf_confirm_server(oxfp, password);      while((oxfp = oxf_connect_active(remote_host, port)) == NULL) {
         oxf_determine_byteorder_server(oxfp);          if (--counter > 0) {
               usleep(100); /* spends 100 micro seconds */
           }else {
               ox_printf("oxc: cannot connect.\n");
               return NULL;
           }
     }      }
       oxf_confirm_server(oxfp, password);
       oxf_determine_byteorder_server(oxfp);
     return oxfp;      return oxfp;
 }  }
   
 /* xterm, kterm, rxvt, gnome-terminal, ... */  __inline__
 static char *xterminal()  static char *sskip(char *s)
 {  {
         char *e = getenv("OpenXM_XTERM");      while (isspace(*s)) {
         return (e != NULL)? e: "xterm";          s++;
       }
       return s;
 }  }
   
 static int basic0[] =  {  __inline__
         CMO_ERROR2,  static char *wskip(char *s)
         CMO_NULL,  {
         CMO_INT32,      while (!isspace(*s) && *s != '\0') {
         CMO_DATUM,          s++;
         CMO_STRING,      }
         CMO_MATHCAP,      return s;
         CMO_LIST,  }
         0  
 };  
   
   static int wc(char *s)
   {
       int n = 0;
       s = sskip(s);
       while(*s != '\0') {
           s = wskip(s);
           s = sskip(s);
           n++;
       }
       return n;
   }
   
   static void word(char *str, int argc, char *argv[])
   {
       int i;
       char *s = strcpy(malloc(strlen(str)+1), str);
       for(i=0; i<argc; i++) {
           s = sskip(s);
           argv[i] = s;
           s = wskip(s);
           *s++ = '\0';
       }
       argv[i] = NULL;
   }
   
   __inline__
   static int arglen(char *args[])
   {
       int len;
       for(len = 0; args[len] != NULL; len++) {
           ;
       }
       return len;
   }
   
   /* xterm, kterm, rxvt, gnome-terminal, ... */
   static char **makeargs(char **oldargs)
   {
       char *e = getenv("OpenXM_XTERM");
       int argc;
       char **newargs;
       int len = arglen(oldargs);
       if (e == NULL) {
           argc = 1;
           newargs = malloc((len+1+argc)*sizeof(char *));
           newargs[0] = "xterm";
       }else {
           argc = wc(e);
           newargs = malloc((len+1+argc)*sizeof(char *));
           word(e, argc, newargs);
       }
       memcpy(newargs+argc, oldargs, (len+1)*sizeof(char *));
       return newargs;
   }
   
 /* We assume that data has the following format:  /* We assume that data has the following format:
    LENGTH hostname '\0' port '\0' password '\0'     LENGTH hostname '\0' port '\0' password '\0'
    where LENGTH is an integer with network byte order and its value     where LENGTH is an integer with network byte order and its value
Line 74  void pipe_read_info(char **hostname, int *port, char *
Line 138  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 *xterm =  xterminal();      char *myname = argv[0];
         char *myname = argv[0];      int oxlog = 0;
         int oxlog = 0;  
     int c;      int c;
       int delay = 0;
       char *delay_s = "0";
           int quiet = 0;
   
     while ((c = getopt(argc, argv, "c:p:h:x")) != -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 'x':          case 'q':
                         if (getenv("DISPLAY") != NULL) {              quiet = 1;
                                 oxlog = 1;  
                         }  
             break;              break;
           case 'x':
               if (getenv("DISPLAY") != NULL) {
                   oxlog = 1;
               }
               break;
           case 'd':
               delay_s = optarg;
               delay = atoi(optarg);
               break;
         default:          default:
               ;
         }          }
     }      }
     argc -= optind;      argc -= optind;
     argv += optind;      argv += optind;
   
       if (!quiet) {
           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) {
                 execlp(xterm, xterm, "-e", myname,          char *common_args[] = {"-e", myname, "-d", delay_s,
                            "-h", remote_host, "-p", port_s, "-c", password);                            "-h", remote_host, "-p", port_s, "-c",
         }                            password, NULL};
           char **args = makeargs(common_args);
           execvp(args[0], args);
       }
   
     fprintf(stderr, "start connection!\n");      ox_printf("start connection!\n");
         if ((oxfp = connection()) == NULL) {      usleep(delay);
         fprintf(stderr, "oxc: cannot connect.\n");      if ((oxfp = connection()) != NULL) {
     }else {          ox_printf("oxc: oxfp = %p, fd = %d\n", oxfp, oxfp->fd);
                 fprintf(stderr, "oxc: oxfp = %p, fd = %d\n", oxfp, oxfp->fd);          mathcap_init("v2000.10.06", "oxc");
             mathcap_init(20001006, "v2000.10.06", "oxc", basic0, NULL);          sm(oxfp);
                 sm(oxfp);      }
         }  
     return 0;      return 0;
 }  }

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

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