/* minazuki6-linux.c - Don Yang (uguu.org) 07/04/02 */ #ifndef j #define j(_,__) _##__ #include __FILE__ int a, m, n = sizeof(t sockaddr_in), w = 0; s x, z; t sockaddr_in u, v; fd_set f, d; t hostent *h; t timeval b; char i[1025], o[1025]; void q(void) { x = socket(PF_INET, SOCK_STREAM, 0); v.sin_family = AF_INET; v.sin_port = htons(w); v.sin_addr.s_addr = htonl(INADDR_ANY); if( bind(x, (p)&v, n) == -1 ) { puts("bind"); x = -1; } } void*k(void*g)/*XXXX*/ { for(o[1024] = '\0'; a; send(x, o, strlen(o), 0)) { printf("> "); fgets(o, 1024, stdin); if( feof(stdin) ) { a = 0; r 0; } } a = 0; r 0; } int main(int l, char **g) { /*ADATA wsadata; if( WSAStartup(2, &wsadata) ) r puts("WSAStartup"*/ if( l < 3 ) r printf("%s \n", *g); if( !(h = gethostbyname(g[1])) ) { if( (u.sin_addr.s_addr = inet_addr(g[1])) == INADDR_NONE ) r puts("inet_addr"); } else { u.sin_addr = *(t in_addr*)h->h_addr; } q(); if( x == -1 ) r 1; u.sin_family = AF_INET; u.sin_port = htons(w = atoi(g[2])); if( connect(x, (p)&u, n) == -1 ) { c(x); q(); if( x == -1 ) r 1; if( listen(x, 1) == -1 ) { c(x); r puts("listen"); } FD_ZERO(&f); FD_SET(x, &f); select(FD_SETSIZE, &f, 0, 0, 0); m = n; z = accept(x, (p)&u, &m); c(x); if( z == -1 ) r puts("accept"); getpeername(z, (p)&u, &n); x = z; } printf("Connected to %s:%hd\n", inet_ntoa(u.sin_addr), ntohs(u.sin_port)); a = 1; pthread_create(&e,00,k,00); FD_ZERO(&f); FD_SET(x, &f); for(; a;) { memcpy(&d, &f, sizeof(fd_set)); b.tv_sec = b.tv_usec = 1; select(FD_SETSIZE, &d, 0, 0, &b); if( FD_ISSET(x, &d) ) { m = recv(x, i, 1024, 0); if( m < 1 ) { a = 0; } else { i[m] = '\0'; printf("\r \r%s> ", i); fflush(stdout); } } } shutdown(x, 2); c(x); putchar(10); /*ACleanup(*/ r 0; } #else #include #include #include #include /* For less warnings, include: arpa/inet.h sys/socket.h unistd.h stdlib.h string.h */ pthread_t e; #define c close #define r return #define t struct typedef t sockaddr* p; typedef int s; #endif