#include #include "lantronix.h" #define NOT_FOUND ((unsigned short)-1) static int debug = 0; struct commstr { __u16 _dummy; __u16 len; __u32 acc; __u32 sid; __u8 code; __u8 d0B; __u16 datalen; __u16 d0E; __u16 d10; __u16 d12; __u16 d14; __u32 did; __u32 d1A; __u16 d1E; __u16 d20; __u8 data[]; }; struct devinfo { __u16 len; __u16 type; __u16 vid; __u16 pid; __u32 port; char client[0x40]; char name1[0x20]; __u8 ip[4]; __u16 d70; __u8 d72; __u8 d73; __u8 d74[4]; __u8 d78[4]; __u8 d7C[2]; __u16 d7E; __u8 d80[0x18]; char sn[0x20]; __u16 dB8; char name2[0x20]; __u16 dDA; }; struct cliinfo { __u16 len; __u16 type; char name[0x60]; __u8 ip[4]; __u8 d68[6]; char d6E[0x20]; }; struct udppacket { __u32 sn; __u32 firm_ver; __u32 firm_rev; __u8 code1; __u8 code2; __u16 tcp_port; __u16 d10; __u16 d12; __u16 d14; __u16 ord; __u32 d18; __u16 vid; __u16 pid; __u32 usb_port; }; static int sock; static struct commstr *salloc = NULL; void freeall() { /* pro atexit() */ free(salloc); close(sock); } int initsock(char *ip) { struct hostent *host; struct sockaddr_in sin; int s; if((host = gethostbyname((void*)ip)) == NULL) return -1; if((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) return -1; sin.sin_family = AF_INET; sin.sin_port = htons(10010); memcpy(&(sin.sin_addr), host->h_addr, host->h_length); if((connect(s, (struct sockaddr*)&sin, sizeof(sin))) == -1) return -1; return s; } void setupstr(struct commstr *str, unsigned char code, unsigned acc, unsigned short d0E, unsigned short d10, unsigned short d12, unsigned short datalen) { memset(str, 0, sizeof(struct commstr)); str->code = code; str->acc = htonl(acc); str->d0E = htons(d0E); str->d10 = htons(d10); str->d12 = htons(d12); str->datalen = htons(datalen); str->len = htons(datalen + 32); memset(str->data, 0, datalen); } void sendstr(struct commstr *str) { unsigned char *stream = (unsigned char*)str + 2; if(debug > 1) { int i; for(i = 0; i < 34 + ntohs(str->datalen); i++) printf("%02X ", (int)(stream[i])); puts(""); } if(send(sock, (void*)stream, 34 + ntohs(str->datalen), 0) < 0) exit(RETVAL_SEND); } void sendsimple(unsigned char code, unsigned acc, unsigned short d0E, unsigned short d10, unsigned short d12) { setupstr(salloc, code, acc, d0E, d10, d12, 0); sendstr(salloc); } struct commstr *readpacket(int sock) { int r, len, o; struct commstr *str; unsigned char *buf; unsigned short prebuf; r = recv(sock, &prebuf, 2, 0); if(r <= 0) exit(RETVAL_RECV); len = ntohs(prebuf)+2; o = 2; str = malloc(len+2); /* Nezapomente uvolnit! */ if(!str) exit(RETVAL_MALLOC); buf = (unsigned char*)str + 2; memcpy(buf, &prebuf, 2); do { r = recv(sock, buf+o, len-o, 0); if(r <= 0) { free(str); exit(RETVAL_RECV); } else o += r; } while(o < len); if(debug > 1) { int i; for(i = 0; i < len; i++) { printf("%02X ", (int)(buf[i])); if(i == 1000) puts(""); } puts(""); } return str; } struct commstr *waitpacket(unsigned char code) { struct commstr *ret; time_t b = time(NULL); for(ret = readpacket(sock); ret->code != code; ret = readpacket(sock)) { free(ret); if(time(NULL)-b > MAXWAIT) exit(RETVAL_WAIT); } return ret; } int main() { struct commstr *ret; struct devinfo *di; /*struct cliinfo *ci;*/ int off; salloc = malloc(sizeof(struct commstr) + MAXDATA); if(!salloc) return RETVAL_MALLOC; sock = initsock(LX_ADDRESS); if(sock == -1) return RETVAL_SOCKET; atexit(freeall); setupstr(salloc, 0x01, 0, 2,1,0, 1+strlen(ID_COMPUTER)); salloc->did = htonl(LX_SERIAL); strcpy((char*)salloc->data, ID_COMPUTER); sendstr(salloc); free(waitpacket(0x11)); sendsimple(0x08, 0, 2,3,0); ret = waitpacket(0x18); printf("Zařízení %08X\n=================\n\nPočet USB zařízení: %i\nPočet klientů: %i\n", LX_SERIAL, ntohs(ret->d0E), ntohs(ret->d10)); for(off = 0; ; off += ntohs(*(unsigned short*)(ret->data+off))) { switch(ret->data[off+2]) { case 0x04: di = (struct devinfo*)(ret->data+off); /*printf("port %i: %04X/%04X %s\t%s", ntohl(di->port)-1, ntohs(di->vid), ntohs(di->pid), di->name1, di->sn);*/ printf("port %i: %s\t%s", ntohl(di->port)-1, di->name1, di->sn); if(di->ip[0]) printf(" [připojený klient: %i.%i.%i.%i %s]", di->ip[0], di->ip[1], di->ip[2], di->ip[3], di->client); printf("\n"); break; /*case 0x05: ci = (struct cliinfo*)(ret->data+off); printf("%s\t%i.%i.%i.%i\n", ci->name, ci->ip[0], ci->ip[1], ci->ip[2], ci->ip[3]); break;*/ case 0x00: break; } if(ret->data[off+2] == 0x00) { off += 4; break; } } printf("\n"); free(ret); return 0; }