ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

qotd.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.