Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenqotd.c
Go to the documentation of this file.
00001 /* 00002 * PROJECT: ReactOS simple TCP/IP services 00003 * LICENSE: GPL - See COPYING in the top level directory 00004 * FILE: /base/services/tcpsvcs/qotd.c 00005 * PURPOSE: Sends a random quote to the client 00006 * COPYRIGHT: Copyright 2005 - 2008 Ged Murphy <gedmurphy@reactos.org> 00007 * 00008 */ 00009 00010 #include "tcpsvcs.h" 00011 00012 static WCHAR szFilePath[] = L"\\drivers\\etc\\quotes"; 00013 00014 static BOOL 00015 SendQuote(SOCKET sock, char* Quote) 00016 { 00017 INT strSize = strlen(Quote); 00018 if (send(sock, Quote, strSize, 0) == SOCKET_ERROR) 00019 return FALSE; 00020 00021 return TRUE; 00022 } 00023 00024 static BOOL 00025 RetrieveQuote(SOCKET sock) 00026 { 00027 HANDLE hFile; 00028 WCHAR szFullPath[MAX_PATH + 20]; 00029 DWORD dwBytesRead; 00030 LPSTR lpQuotes; 00031 LPSTR lpStr; 00032 INT quoteNum; 00033 INT NumQuotes = 0; 00034 INT i; 00035 00036 if(!GetSystemDirectoryW(szFullPath, MAX_PATH)) 00037 { 00038 LogEvent(L"QOTD: Getting system path failed", GetLastError(), 0, LOG_FILE); 00039 return FALSE; 00040 } 00041 wcscat(szFullPath, szFilePath); 00042 00043 00044 LogEvent(L"QOTD: Opening quotes file", 0, 0, LOG_FILE); 00045 hFile = CreateFileW(szFullPath, 00046 GENERIC_READ, 00047 0, 00048 NULL, 00049 OPEN_EXISTING, 00050 FILE_ATTRIBUTE_NORMAL, 00051 NULL); 00052 if (hFile == INVALID_HANDLE_VALUE) 00053 { 00054 LogEvent(L"QOTD: Error opening quotes file", GetLastError(), 0, LOG_FILE); 00055 } 00056 else 00057 { 00058 DWORD dwSize = GetFileSize(hFile, NULL); 00059 lpQuotes = (LPSTR)HeapAlloc(GetProcessHeap(), 0, dwSize); 00060 if (!lpQuotes) 00061 { 00062 CloseHandle(hFile); 00063 return FALSE; 00064 } 00065 00066 ReadFile(hFile, 00067 lpQuotes, 00068 dwSize, 00069 &dwBytesRead, 00070 NULL); 00071 CloseHandle(hFile); 00072 00073 lpQuotes[dwSize] = 0; 00074 00075 if (dwBytesRead != dwSize) 00076 return FALSE; 00077 00078 lpStr = lpQuotes; 00079 while (*lpStr) 00080 { 00081 if (*lpStr == '%') 00082 NumQuotes++; 00083 lpStr++; 00084 } 00085 00086 /* pick a random quote */ 00087 srand((unsigned int) GetTickCount()); 00088 quoteNum = rand() % NumQuotes; 00089 00090 /* retrieve the full quote */ 00091 lpStr = lpQuotes; 00092 for (i = 1; i <= quoteNum; i++) 00093 { 00094 /* move past proceding quote */ 00095 lpStr++; 00096 00097 if (i == quoteNum) 00098 { 00099 LPSTR lpStart = lpStr; 00100 00101 while (*lpStr != '%' && *lpStr != '\0') 00102 lpStr++; 00103 00104 *lpStr = 0; 00105 00106 /* send the quote */ 00107 if (!SendQuote(sock, lpStart)) 00108 LogEvent(L"QOTD: Error sending data", 0, 0, LOG_FILE); 00109 break; 00110 } 00111 else 00112 { 00113 while (*lpStr != '%' && *lpStr != '\0') 00114 lpStr++; 00115 00116 /* move past % and RN */ 00117 lpStr += 2; 00118 } 00119 } 00120 00121 return TRUE; 00122 } 00123 00124 return FALSE; 00125 } 00126 00127 00128 DWORD WINAPI 00129 QotdHandler(VOID* sock_) 00130 { 00131 SOCKET sock = (SOCKET)sock_; 00132 DWORD retVal = 0; 00133 00134 if (!RetrieveQuote(sock)) 00135 { 00136 LogEvent(L"QOTD: Error retrieving quote", 0, 0, LOG_FILE); 00137 retVal = 1; 00138 } 00139 00140 LogEvent(L"QOTD: Shutting connection down", 0, 0, LOG_FILE); 00141 if (ShutdownConnection(sock, FALSE)) 00142 { 00143 LogEvent(L"QOTD: Connection is down", 0, 0, LOG_FILE); 00144 } 00145 else 00146 { 00147 LogEvent(L"QOTD: Connection shutdown failed", 0, 0, LOG_FILE); 00148 LogEvent(L"QOTD: Terminating thread", 0, 0, LOG_FILE); 00149 retVal = 1; 00150 } 00151 00152 LogEvent(L"QOTD: Terminating thread", 0, 0, LOG_FILE); 00153 ExitThread(retVal); 00154 } Generated on Sat May 26 2012 04:16:38 for ReactOS by
1.7.6.1
|