Diff for /ansh/src/daemon2.c between versions 1.1.1.1.2.8 and 1.5

version 1.1.1.1.2.8, 2011/10/14 12:03:10 version 1.5, 2015/05/19 23:25:30
Line 12  terms: Line 12  terms:
 All of the documentation and software included in the ELWIX and AITNET  All of the documentation and software included in the ELWIX and AITNET
 Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>  Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2013
         by Michael Pounov <misho@elwix.org>.  All rights reserved.          by Michael Pounov <misho@elwix.org>.  All rights reserved.
   
 Redistribution and use in source and binary forms, with or without  Redistribution and use in source and binary forms, with or without
Line 52  pktTx(sched_task_t *task) Line 52  pktTx(sched_task_t *task)
 {  {
         struct tagProc *proc;          struct tagProc *proc;
         int wlen;          int wlen;
         u_char *str;  
   
         FTRACE(3);          FTRACE(3);
   
Line 60  pktTx(sched_task_t *task) Line 59  pktTx(sched_task_t *task)
         if (!(proc = TASK_ARG(task)))          if (!(proc = TASK_ARG(task)))
                 return (void*) -1;                  return (void*) -1;
   
         if (Crypted) {  
                 str = cryptBuffer(proc->proc_buf_[FD2NET], proc->proc_rlen_[FD2NET], Crypted);  
                 if (str) {  
                         memcpy(proc->proc_buf_[FD2NET], str, proc->proc_rlen_[FD2NET]);  
                         free(str);  
                 }  
         }  
   
         if ((wlen = pktSend(TASK_FD(task), ++proc->proc_seq, proc->proc_flg, Crypted,           if ((wlen = pktSend(TASK_FD(task), ++proc->proc_seq, proc->proc_flg, Crypted, 
                                         proc->proc_buf_[FD2NET], proc->proc_rlen_[FD2NET],                                           proc->proc_buf_[FD2NET], proc->proc_rlen_[FD2NET], 
                                         &proc->proc_ea)) != ANSH_FLG_ERR) {                                          &proc->proc_ea)) != ANSH_FLG_ERR) {
Line 82  pktTx(sched_task_t *task) Line 73  pktTx(sched_task_t *task)
 void *  void *
 pktRx(sched_task_t *task)  pktRx(sched_task_t *task)
 {  {
        u_char *buf, *str;        u_char *buf;
         struct ether_header eth;          struct ether_header eth;
         int rlen, n = 0;          int rlen, n = 0;
         struct tagProc *proc = NULL;          struct tagProc *proc = NULL;
Line 93  pktRx(sched_task_t *task) Line 84  pktRx(sched_task_t *task)
         FTRACE(3);          FTRACE(3);
   
         rlen = bpfLEN;          rlen = bpfLEN;
        if (!(buf = malloc(rlen)))        if (!(buf = e_malloc(rlen)))
                 goto end;                  goto end;
         else          else
                 memset(buf, 0, rlen);                  memset(buf, 0, rlen);
Line 116  pktRx(sched_task_t *task) Line 107  pktRx(sched_task_t *task)
                 goto end;                  goto end;
         }          }
   
         if (Crypted) {  
                 str = cryptBuffer(buf, rlen, Crypted);  
                 if (str) {  
                         memcpy(buf, str, rlen);  
                         free(str);  
                 }  
         }  
   
         switch (ret) {          switch (ret) {
                 case ANSH_FLG_EOF:                  case ANSH_FLG_EOF:
                 case ANSH_FLG_CPOUT:                  case ANSH_FLG_CPOUT:
Line 150  pktRx(sched_task_t *task) Line 133  pktRx(sched_task_t *task)
         proc->proc_rlen_[NET2FD] = rlen;          proc->proc_rlen_[NET2FD] = rlen;
         memset(proc->proc_buf_[NET2FD], 0, proc->proc_blen);          memset(proc->proc_buf_[NET2FD], 0, proc->proc_blen);
         memcpy(proc->proc_buf_[NET2FD], buf, proc->proc_rlen_[NET2FD]);          memcpy(proc->proc_buf_[NET2FD], buf, proc->proc_rlen_[NET2FD]);
        schedWrite(TASK_ROOT(task), fdTx, proc, proc->proc_pty);        schedWrite(TASK_ROOT(task), fdTx, proc, proc->proc_pty, NULL, 0);
 end:  end:
        free(buf);        e_free(buf);
        schedRead(TASK_ROOT(task), pktRx, NULL, proc ? proc->proc_sock : TASK_FD(task));        schedRead(TASK_ROOT(task), pktRx, NULL, proc ? proc->proc_sock : TASK_FD(task), NULL, 0);
         return NULL;          return NULL;
 }  }
   
Line 161  void * Line 144  void *
 fdTx(sched_task_t *task)  fdTx(sched_task_t *task)
 {  {
         struct tagProc *proc;          struct tagProc *proc;
        struct timeval tv = { 0 };        struct timespec ts = { 0 };
         int wlen;          int wlen;
   
         FTRACE(3);          FTRACE(3);
Line 174  fdTx(sched_task_t *task) Line 157  fdTx(sched_task_t *task)
         if (proc->proc_flg != ANSH_FLG_CPOUT || !proc->proc_pid)          if (proc->proc_flg != ANSH_FLG_CPOUT || !proc->proc_pid)
                 return NULL;                  return NULL;
   
         /*  
         if (waitpid(proc->proc_pid, &wlen, WNOHANG)) {  
                 ioFreePTY(TASK_FD(task), proc->proc_ttyname);  
                 schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL);  
   
                 proc->proc_pid = 0;  
                 proc->proc_seq = 0;  
                 proc->proc_flg = ANSH_FLG_EOF;  
                 proc->proc_rlen_[FD2NET] = 0;  
   
                 schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock);  
                 return NULL;  
         }  
         */  
   
         /* if Timeout defined, disarm timer */          /* if Timeout defined, disarm timer */
         if (Timeout)          if (Timeout)
                schedCancelby(TASK_ROOT(task), &TASK_ROOT(task)->root_timer, CRITERIA_CALL, TOfunc, NULL);                schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_CALL, TOfunc, NULL);
   
         wlen = write(TASK_FD(task), proc->proc_buf_[NET2FD], proc->proc_rlen_[NET2FD]);          wlen = write(TASK_FD(task), proc->proc_buf_[NET2FD], proc->proc_rlen_[NET2FD]);
         switch (wlen) {          switch (wlen) {
                 case -1:                  case -1:
                         ERR("write2tty #%d - %s", errno, strerror(errno));                          ERR("write2tty #%d - %s", errno, strerror(errno));
                         /* exit from shell and release tty */                          /* exit from shell and release tty */
                         /*  
                         waitpid(proc->proc_pid, &wlen, 0);  
                         ioFreePTY(TASK_FD(task), proc->proc_ttyname);  
                         schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL);  
   
                         proc->proc_pid = 0;  
                         proc->proc_seq = 0;  
                         proc->proc_flg = ANSH_FLG_EOF;  
                         proc->proc_rlen_[FD2NET] = 0;  
   
                         schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock);  
                         */  
                         return NULL;                          return NULL;
                 default:                  default:
                         proc->proc_flg = ANSH_FLG_OK;                          proc->proc_flg = ANSH_FLG_OK;
Line 219  fdTx(sched_task_t *task) Line 175  fdTx(sched_task_t *task)
   
         /* if Timeout defined, go arm timer */          /* if Timeout defined, go arm timer */
         if (Timeout) {          if (Timeout) {
                tv.tv_sec = Timeout;                ts.tv_sec = Timeout;
                schedTimer(TASK_ROOT(task), TOfunc, proc, tv);                schedTimer(TASK_ROOT(task), TOfunc, proc, ts, NULL, 0);
         }          }
         return NULL;          return NULL;
 }  }
Line 229  void * Line 185  void *
 fdRx(sched_task_t *task)  fdRx(sched_task_t *task)
 {  {
         struct tagProc *proc;          struct tagProc *proc;
        struct timeval tv = { 0 };        struct timespec ts = { 0 };
         int rlen;          int rlen;
   
         FTRACE(3);          FTRACE(3);
Line 240  fdRx(sched_task_t *task) Line 196  fdRx(sched_task_t *task)
         if (!proc->proc_pid)          if (!proc->proc_pid)
                 return NULL;                  return NULL;
   
         /*  
         if (waitpid(proc->proc_pid, &rlen, WNOHANG)) {  
                 ioFreePTY(TASK_FD(task), proc->proc_ttyname);  
                 schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL);  
   
                 proc->proc_pid = 0;  
                 proc->proc_seq = 0;  
                 proc->proc_flg = ANSH_FLG_EOF;  
                 proc->proc_rlen_[FD2NET] = 0;  
   
                 schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock);  
                 return NULL;  
         }  
         */  
   
         /* if Timeout defined, disarm timer */          /* if Timeout defined, disarm timer */
         if (Timeout)          if (Timeout)
                schedCancelby(TASK_ROOT(task), &TASK_ROOT(task)->root_timer, CRITERIA_CALL, TOfunc, NULL);                schedCancelby(TASK_ROOT(task), taskTIMER, CRITERIA_CALL, TOfunc, NULL);
   
         memset(proc->proc_buf_[FD2NET], 0, proc->proc_blen);          memset(proc->proc_buf_[FD2NET], 0, proc->proc_blen);
         rlen = read(TASK_FD(task), proc->proc_buf_[FD2NET],           rlen = read(TASK_FD(task), proc->proc_buf_[FD2NET], 
Line 267  fdRx(sched_task_t *task) Line 208  fdRx(sched_task_t *task)
                         ERR("readtty #%d - %s", errno, strerror(errno));                          ERR("readtty #%d - %s", errno, strerror(errno));
                 case 0:                  case 0:
                         /* exit from shell and release tty */                          /* exit from shell and release tty */
                         /*  
                         waitpid(proc->proc_pid, &rlen, 0);  
                         ioFreePTY(TASK_FD(task), proc->proc_ttyname);  
                         schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL);  
                         VERB(3) LOG("EOF process status %d", rlen);  
   
                         proc->proc_pid = 0;  
                         proc->proc_seq = 0;  
                         proc->proc_flg = ANSH_FLG_EOF;  
                         proc->proc_rlen_[FD2NET] = 0;  
   
                         schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock);  
                         */  
                         return NULL;                          return NULL;
                 default:                  default:
                         proc->proc_flg = ANSH_FLG_OK;                          proc->proc_flg = ANSH_FLG_OK;
Line 287  fdRx(sched_task_t *task) Line 215  fdRx(sched_task_t *task)
         }          }
         VERB(3) LOG("Readed %d bytes - %s", rlen, proc->proc_buf_[FD2NET]);          VERB(3) LOG("Readed %d bytes - %s", rlen, proc->proc_buf_[FD2NET]);
   
        schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock);        schedCallOnce(TASK_ROOT(task), pktTx, proc, proc->proc_sock, NULL, 0);
        schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty);        schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty, NULL, 0);
   
         /* if Timeout defined, go arm timer */          /* if Timeout defined, go arm timer */
         if (Timeout) {          if (Timeout) {
                tv.tv_sec = Timeout;                ts.tv_sec = Timeout;
                schedTimer(TASK_ROOT(task), TOfunc, proc, tv);                schedTimer(TASK_ROOT(task), TOfunc, proc, ts, NULL, 0);
         }          }
         return NULL;          return NULL;
 }  }
Line 302  int Line 230  int
 spawnLogin(sched_task_t *task, struct tagProc *proc)  spawnLogin(sched_task_t *task, struct tagProc *proc)
 {  {
         int flg;          int flg;
        struct timeval tv = { 0 };        struct timespec ts = { 0 };
         char str[STRSIZ] = { 0 };          char str[STRSIZ] = { 0 };
   
         FTRACE(3);          FTRACE(3);
Line 317  spawnLogin(sched_task_t *task, struct tagProc *proc) Line 245  spawnLogin(sched_task_t *task, struct tagProc *proc)
                 case 0:                  case 0:
                         printf("anshd ELWIX remote management system (%s)\n\n", proc->proc_ttyname);                          printf("anshd ELWIX remote management system (%s)\n\n", proc->proc_ttyname);
                         strlcpy(str, "-hansh@", sizeof str);                          strlcpy(str, "-hansh@", sizeof str);
                        io_ether_ntoa((const struct io_ether_addr*) &proc->proc_ea, str + 7, 18);                        e_ether_ntoa((const ether_addr_t*) &proc->proc_ea, str + 7, 18);
   
                         execl("/usr/bin/login", "login", str, NULL);                          execl("/usr/bin/login", "login", str, NULL);
                         /* never reached */                          /* never reached */
Line 327  spawnLogin(sched_task_t *task, struct tagProc *proc) Line 255  spawnLogin(sched_task_t *task, struct tagProc *proc)
                         fcntl(proc->proc_pty, F_SETFL, flg | O_NONBLOCK);                          fcntl(proc->proc_pty, F_SETFL, flg | O_NONBLOCK);
   
                         VERB(3) LOG("Parent know child pid %d", proc->proc_pid);                          VERB(3) LOG("Parent know child pid %d", proc->proc_pid);
                        schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty);                        schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty, NULL, 0);
   
                         /* if Timeout defined, go arm timer */                          /* if Timeout defined, go arm timer */
                         if (Timeout) {                          if (Timeout) {
                                tv.tv_sec = Timeout;                                ts.tv_sec = Timeout;
                                schedTimer(TASK_ROOT(task), TOfunc, proc, tv);                                schedTimer(TASK_ROOT(task), TOfunc, proc, ts, NULL, 0);
                         }                          }
                         break;                          break;
         }          }

Removed from v.1.1.1.1.2.8  
changed lines
  Added in v.1.5


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