--- ansh/src/utils.c 2011/10/31 09:46:18 1.2.2.1 +++ ansh/src/utils.c 2015/05/19 23:30:06 1.5.2.1 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ - * $Id: utils.c,v 1.2.2.1 2011/10/31 09:46:18 misho Exp $ + * $Id: utils.c,v 1.5.2.1 2015/05/19 23:30:06 misho Exp $ * ************************************************************************* The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +Copyright 2004 - 2015 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -128,13 +128,14 @@ PrepareL2(const char *psDev, int *bpflen) } int -PrepareL3(const struct sockaddr *sa, int *bpflen) +PrepareL3(const sockaddr_t *sa, int *bpflen) { int h, n = 1; FTRACE(3); + assert(sa); - h = socket(sa->sa_family, SOCK_RAW, IPPROTO_ICMP); + h = socket(sa->sa.sa_family ? sa->sa.sa_family : AF_INET, SOCK_RAW, IPPROTO_ICMP); if (h == -1) { printf("Error:: Cant open raw socket #%d - %s\n", errno, strerror(errno)); return -1; @@ -146,7 +147,7 @@ PrepareL3(const struct sockaddr *sa, int *bpflen) return -1; } */ - if (sa && bind(h, sa, sizeof(struct sockaddr)) == -1) { + if (sa->sa.sa_family && bind(h, &sa->sa, sa->sa.sa_len) == -1) { printf("Error:: Cant bind to raw socket #%d - %s\n", errno, strerror(errno)); close(h); return -1; @@ -162,7 +163,7 @@ PrepareL3(const struct sockaddr *sa, int *bpflen) char icmpRecv(int s, u_int * __restrict seq, u_short * __restrict id, u_int * __restrict crypted, - u_char * __restrict data, int * __restrict datlen, struct sockaddr *sa, socklen_t *salen) + u_char * __restrict data, int * __restrict datlen, sockaddr_t *sa, socklen_t *salen) { int ret = 0; struct icmp *icmp; @@ -170,7 +171,7 @@ icmpRecv(int s, u_int * __restrict seq, u_short * __re u_char buf[USHRT_MAX] = { 0 }; u_int crc; - ret = recvfrom(s, buf, sizeof buf, 0, sa, salen); + ret = recvfrom(s, buf, sizeof buf, 0, &sa->sa, salen); if (ret == -1) { ERR("Receive recvfrom() #%d - %s", errno, strerror(errno)); return ANSH_FLG_ERR; @@ -236,7 +237,7 @@ icmpRecv(int s, u_int * __restrict seq, u_short * __re int icmpSend(int s, u_int seq, u_short id, char flg, u_int crypted, u_char *data, int datlen, - struct sockaddr *sa, socklen_t salen) + sockaddr_t *sa, socklen_t salen) { u_char *pos, buf[USHRT_MAX] = { 0 }; struct icmp *icmp; @@ -269,7 +270,7 @@ icmpSend(int s, u_int seq, u_short id, char flg, u_int icmp->icmp_cksum = crcIP(buf, sizeof(struct icmp) + sizeof(struct ansh_hdr) + datlen); if ((ret = sendto(s, buf, sizeof(struct icmp) + sizeof(struct ansh_hdr) + datlen, - 0, sa, salen)) == -1) { + 0, &sa->sa, salen)) == -1) { ERR("Send sendto() #%d - %s", errno, strerror(errno)); return ANSH_FLG_ERR; } else @@ -284,7 +285,7 @@ icmpSend(int s, u_int seq, u_short id, char flg, u_int } static int -_pkt_Send(int s, u_int seq, char flg, u_int crypted, u_char *data, int datlen, struct io_ether_addr *ea) +_pkt_Send(int s, u_int seq, char flg, u_int crypted, u_char *data, int datlen, ether_addr_t *ea) { u_char *pos, *str, buf[USHRT_MAX] = { 0 }; struct ether_header *e = (struct ether_header*) buf; @@ -296,7 +297,7 @@ _pkt_Send(int s, u_int seq, char flg, u_int crypted, u return ANSH_FLG_ERR; e->ether_type = ntohs(ANSH_ID); - memcpy(e->ether_dhost, ea->ether_addr_octet, ETHER_ADDR_LEN); + memcpy(e->ether_dhost, ea->octet, ETHER_ADDR_LEN); hdr = (struct ansh_hdr*) (buf + ETHER_HDR_LEN); pos = ((u_char*) hdr) + sizeof(struct ansh_hdr); @@ -306,7 +307,7 @@ _pkt_Send(int s, u_int seq, char flg, u_int crypted, u str = cryptBuffer(pos, datlen, Crypted); if (str) { memcpy(pos, str, datlen); - free(str); + e_free(str); } } @@ -333,7 +334,7 @@ _pkt_Send(int s, u_int seq, char flg, u_int crypted, u } int -pktSend(int s, u_int seq, char flg, u_int crypted, u_char *data, int datlen, struct io_ether_addr *ea) +pktSend(int s, u_int seq, char flg, u_int crypted, u_char *data, int datlen, struct e_ether_addr *ea) { int wlen, ret = 0; u_char *pos = data; @@ -418,7 +419,7 @@ _pkt_Recv(u_char * __restrict buf, int rlen, u_int * _ if (str) { memcpy(buf + bpf->bh_hdrlen + ETHER_HDR_LEN + sizeof(struct ansh_hdr), str, *datlen); - free(str); + e_free(str); } } @@ -445,7 +446,7 @@ pktRecv(int s, u_int * __restrict seq, u_int * __restr else memset(data, 0, *datlen); - if (!(buf = malloc(*datlen))) { + if (!(buf = e_malloc(*datlen))) { ERR("malloc() #%d - %s", errno, strerror(errno)); return ANSH_FLG_ERR; } @@ -453,7 +454,7 @@ pktRecv(int s, u_int * __restrict seq, u_int * __restr rlen = read(s, buf, *datlen); if (rlen == -1) { ERR("Receive packet() #%d - %s", errno, strerror(errno)); - free(buf); + e_free(buf); return ANSH_FLG_ERR; } else VERB(4) LOG("Get packet with len=%d", rlen); @@ -461,7 +462,7 @@ pktRecv(int s, u_int * __restrict seq, u_int * __restr /* check header len */ if (rlen < (sizeof(struct bpf_hdr) + ETHER_HDR_LEN + sizeof(struct ansh_hdr))) { VERB(1) LOG("Discard packet too short %d ...", rlen); - free(buf); + e_free(buf); return ANSH_FLG_ERR; } else { bpf = (struct bpf_hdr*) buf; @@ -472,7 +473,7 @@ pktRecv(int s, u_int * __restrict seq, u_int * __restr ptr = next = buf; ptrlen = nextlen = rlen; if ((flg = _pkt_Recv(ptr, ptrlen, seq, crypted, pos, &buflen, &next, &nextlen)) == -1) { - free(buf); + e_free(buf); return ANSH_FLG_ERR; } else { pos += buflen; @@ -491,7 +492,7 @@ pktRecv(int s, u_int * __restrict seq, u_int * __restr ptrlen = nextlen; } - free(buf); + e_free(buf); return flg; } @@ -533,33 +534,4 @@ cryptBuffer(u_char *buf, int rlen, u_int ctr) return NULL; return str; -} - -int -stopProcess(sched_root_task_t * __restrict root, proc_head_t * __restrict h, pid_t pid, sched_task_func_t func) -{ - struct tagProc *p; - - FTRACE(3); - - SLIST_FOREACH(p, h, proc_next) - if (p->proc_pid == pid) { - break; - } - VERB(3) LOG("pid=%d found=%p\n", pid, p); - if (!p) - return 1; - - ioFreePTY(p->proc_pty, p->proc_ttyname); - if (p->proc_pty) - schedCancelby(root, NULL, CRITERIA_FD, (void*) ((intptr_t) p->proc_pty), NULL); - - p->proc_pty = 0; - p->proc_pid = 0; - p->proc_seq = 0; - p->proc_flg = ANSH_FLG_EOF; - p->proc_rlen_[FD2NET] = 0; - - schedCallOnce(root, func, p, p->proc_sock); - return 0; }