Annotation of ansh/src/daemon2.c, revision 1.1.1.1

1.1       misho       1: /*************************************************************************
                      2:  * (C) 2011 AITNET - Sofia/Bulgaria - <office@aitnet.org>
                      3:  *  by Michael Pounov <misho@elwix.org>
                      4:  *
                      5:  * $Author: misho $
                      6:  * $Id: global.h,v 1.2 2011/06/08 12:45:40 misho Exp $
                      7:  *
                      8:  *************************************************************************/
                      9: #include "global.h"
                     10: #include "anshd.h"
                     11: 
                     12: 
                     13: void *
                     14: pktTx(sched_task_t *task)
                     15: {
                     16:        struct tagProc *proc;
                     17:        int wlen;
                     18: 
                     19:        FTRACE(3);
                     20: 
                     21:        /* not found argument, drop data */
                     22:        if (!(proc = TASK_ARG(task)))
                     23:                return (void*) -1;
                     24: 
                     25:        if ((wlen = pktSend(TASK_FD(task), proc->proc_id, proc->proc_flg, proc->proc_buf_[FD2NET], 
                     26:                        proc->proc_rlen_[FD2NET], &proc->proc_ea)) != ANSH_FLG_ERR) {
                     27:                proc->proc_flg = ANSH_FLG_OK;
                     28:                proc->proc_rlen_[FD2NET] = 0;
                     29:        }
                     30:        VERB(5) LOG("Sended %d bytes", wlen);
                     31: 
                     32:        return NULL;
                     33: }
                     34: 
                     35: void *
                     36: pktRx(sched_task_t *task)
                     37: {
                     38:        u_char *buf;
                     39:        struct ether_header eth;
                     40:        int rlen, n = 0;
                     41:        struct tagProc *proc = NULL;
                     42:        char ret;
                     43:        u_short *b;
                     44: 
                     45:        FTRACE(3);
                     46: 
                     47:        rlen = bpfLEN;
                     48:        if (!(buf = malloc(rlen)))
                     49:                goto end;
                     50: 
                     51:        if ((ret = pktRecv(TASK_FD(task), buf, &rlen, &eth)) == ANSH_FLG_ERR)
                     52:                goto end;
                     53:        VERB(5) LOG("Received %d bytes", rlen);
                     54: 
                     55:        /* packet is ok find active session */
                     56:        SLIST_FOREACH(proc, &pH, proc_next)
                     57:                if (proc->proc_id == ntohs(eth.ether_type)) {
                     58:                        n = ANSH_CODE;
                     59:                        break;
                     60:                }
                     61:        /* not found in sessions, drop packet */
                     62:        if (n != ANSH_CODE)
                     63:                goto end;
                     64: 
                     65:        switch (ret) {
                     66:                case ANSH_FLG_EOF:
                     67:                case ANSH_FLG_CPOUT:
                     68:                        break;
                     69:                case ANSH_FLG_WINZ:
                     70:                        b = (u_short*) buf;
                     71:                        ioChgWinPTY(proc->proc_pty, ntohs(buf[0]), ntohs(buf[1]), ntohs(buf[2]), ntohs(buf[3]));
                     72:                        /* if not started login, lets start & go! */
                     73:                        if (!proc->proc_pid) {
                     74:                                memcpy(&proc->proc_ea.octet, &eth.ether_shost, ETHER_ADDR_LEN);
                     75:                                spawnLogin(task, proc);
                     76:                        }
                     77:                default:
                     78:                        goto end;
                     79:        }
                     80: 
                     81:        proc->proc_flg = ret;
                     82:        proc->proc_rlen_[NET2FD] = rlen;
                     83:        memset(proc->proc_buf_[NET2FD], 0, proc->proc_blen);
                     84:        memcpy(proc->proc_buf_[NET2FD], buf, proc->proc_rlen_[NET2FD]);
                     85:        schedWrite(TASK_ROOT(task), fdTx, proc, proc->proc_pty);
                     86: end:
                     87:        free(buf);
                     88:        schedRead(TASK_ROOT(task), pktRx, NULL, proc ? proc->proc_sock : TASK_FD(task));
                     89:        return NULL;
                     90: }
                     91: 
                     92: void *
                     93: fdTx(sched_task_t *task)
                     94: {
                     95:        struct tagProc *proc;
                     96:        int wlen;
                     97: 
                     98:        FTRACE(3);
                     99: 
                    100:        /* not found argument, drop data */
                    101:        if (!(proc = TASK_ARG(task)))
                    102:                return (void*) -1;
                    103: 
                    104:        /* if != ANSH_FLG_CPOUT isnt received from client */
                    105:        if (proc->proc_flg != ANSH_FLG_CPOUT)
                    106:                return NULL;
                    107: 
                    108:        if (waitpid(proc->proc_pid, &wlen, WNOHANG)) {
                    109:                schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL);
                    110:                ioFreePTY(TASK_FD(task), proc->proc_ttyname);
                    111: 
                    112:                proc->proc_pid = 0;
                    113:                proc->proc_flg = ANSH_FLG_EOF;
                    114:                proc->proc_rlen_[FD2NET] = 0;
                    115: 
                    116:                schedWrite(TASK_ROOT(task), pktTx, proc, proc->proc_sock);
                    117:                return NULL;
                    118:        }
                    119: 
                    120:        wlen = write(TASK_FD(task), proc->proc_buf_[NET2FD], proc->proc_rlen_[NET2FD]);
                    121:        switch (wlen) {
                    122:                case -1:
                    123:                        ERR("write2tty #%d - %s", errno, strerror(errno));
                    124:                        /* exit from shell and release tty */
                    125:                        schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL);
                    126:                        waitpid(proc->proc_pid, &wlen, 0);
                    127:                        ioFreePTY(TASK_FD(task), proc->proc_ttyname);
                    128: 
                    129:                        proc->proc_pid = 0;
                    130:                        proc->proc_flg = ANSH_FLG_EOF;
                    131:                        proc->proc_rlen_[FD2NET] = 0;
                    132: 
                    133:                        schedWrite(TASK_ROOT(task), pktTx, proc, proc->proc_sock);
                    134:                        return NULL;
                    135:                default:
                    136:                        proc->proc_flg = ANSH_FLG_OK;
                    137:                        proc->proc_rlen_[NET2FD] = 0;
                    138:        }
                    139:        VERB(3) LOG("Writed %d bytes - %s", wlen, proc->proc_buf_[NET2FD]);
                    140: 
                    141:        return NULL;
                    142: }
                    143: 
                    144: void *
                    145: fdRx(sched_task_t *task)
                    146: {
                    147:        struct tagProc *proc;
                    148:        int rlen;
                    149: 
                    150:        FTRACE(3);
                    151: 
                    152:        /* not found argument, drop data */
                    153:        if (!(proc = TASK_ARG(task)))
                    154:                return (void*) -1;
                    155: 
                    156:        if (waitpid(proc->proc_pid, &rlen, WNOHANG)) {
                    157:                schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL);
                    158:                ioFreePTY(TASK_FD(task), proc->proc_ttyname);
                    159: 
                    160:                proc->proc_pid = 0;
                    161:                proc->proc_flg = ANSH_FLG_EOF;
                    162:                proc->proc_rlen_[FD2NET] = 0;
                    163: 
                    164:                schedWrite(TASK_ROOT(task), pktTx, proc, proc->proc_sock);
                    165:                return NULL;
                    166:        }
                    167: 
                    168:        memset(proc->proc_buf_[FD2NET], 0, proc->proc_blen);
                    169:        rlen = read(TASK_FD(task), proc->proc_buf_[FD2NET], proc->proc_blen);
                    170:        switch (rlen) {
                    171:                case -1:
                    172:                        ERR("readtty #%d - %s", errno, strerror(errno));
                    173:                case 0:
                    174:                        /* exit from shell and release tty */
                    175:                        schedCancelby(TASK_ROOT(task), NULL, CRITERIA_FD, (void*) TASK_FD(task), NULL);
                    176:                        waitpid(proc->proc_pid, &rlen, 0);
                    177:                        VERB(3) LOG("EOF process status %d", rlen);
                    178:                        ioFreePTY(TASK_FD(task), proc->proc_ttyname);
                    179: 
                    180:                        proc->proc_pid = 0;
                    181:                        proc->proc_flg = ANSH_FLG_EOF;
                    182:                        proc->proc_rlen_[FD2NET] = 0;
                    183: 
                    184:                        schedWrite(TASK_ROOT(task), pktTx, proc, proc->proc_sock);
                    185:                        return NULL;
                    186:                default:
                    187:                        proc->proc_flg = ANSH_FLG_OK;
                    188:                        proc->proc_rlen_[FD2NET] = rlen;
                    189:        }
                    190:        VERB(3) LOG("Readed %d bytes - %s", rlen, proc->proc_buf_[FD2NET]);
                    191: 
                    192:        schedWrite(TASK_ROOT(task), pktTx, proc, proc->proc_sock);
                    193:        schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty);
                    194:        return NULL;
                    195: }
                    196: 
                    197: int
                    198: spawnLogin(sched_task_t *task, struct tagProc *proc)
                    199: {
                    200:        FTRACE(3);
                    201: 
                    202:        assert(proc);
                    203: 
                    204:        switch ((proc->proc_pid = ioForkPTY(&proc->proc_pty, proc->proc_ttyname, 
                    205:                                        sizeof proc->proc_ttyname, NULL, NULL, NULL))) {
                    206:                case -1:
                    207:                        ERR("ioForkPTY() #%d - %s", io_GetErrno(), io_GetError());
                    208:                        return -1;
                    209:                case 0:
                    210:                        execl("/usr/bin/login", "login", NULL);
                    211: //                     execl("/bin/echo", "echo", "MUUUUUUUUUUUUUUUUU", NULL);
                    212:                        /* never reached */
                    213:                        return -1;
                    214:                default:
                    215:                        VERB(3) LOG("Parent know child pid %d - ptyfd=%d", proc->proc_pid, proc->proc_pty);
                    216:                        schedRead(TASK_ROOT(task), fdRx, proc, proc->proc_pty);
                    217:                        break;
                    218:        }
                    219: 
                    220:        return 0;
                    221: }

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