2 * PROJECT: ReactOS simple TCP/IP services
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/services/tcpsvcs/qotd.c
5 * PURPOSE: Sends a random quote to the client
6 * COPYRIGHT: Copyright 2005 - 2008 Ged Murphy <gedmurphy@reactos.org>
14 static WCHAR szFilePath
[] = L
"\\drivers\\etc\\quotes";
17 SendQuote(SOCKET sock
, char* Quote
)
19 INT strSize
= strlen(Quote
);
20 if (send(sock
, Quote
, strSize
, 0) == SOCKET_ERROR
)
27 RetrieveQuote(SOCKET sock
)
30 WCHAR szFullPath
[MAX_PATH
+ 20];
38 if(!GetSystemDirectoryW(szFullPath
, MAX_PATH
))
40 LogEvent(L
"QOTD: Getting system path failed", GetLastError(), 0, LOG_FILE
);
43 wcscat(szFullPath
, szFilePath
);
46 LogEvent(L
"QOTD: Opening quotes file", 0, 0, LOG_FILE
);
47 hFile
= CreateFileW(szFullPath
,
52 FILE_ATTRIBUTE_NORMAL
,
54 if (hFile
== INVALID_HANDLE_VALUE
)
56 LogEvent(L
"QOTD: Error opening quotes file", GetLastError(), 0, LOG_FILE
);
60 DWORD dwSize
= GetFileSize(hFile
, NULL
);
61 lpQuotes
= (LPSTR
)HeapAlloc(GetProcessHeap(), 0, dwSize
+ 1);
77 if (dwBytesRead
!= dwSize
)
79 HeapFree(GetProcessHeap(), 0, lpQuotes
);
91 /* pick a random quote */
92 srand((unsigned int) GetTickCount());
93 quoteNum
= rand() % NumQuotes
;
95 /* retrieve the full quote */
97 for (i
= 1; i
<= quoteNum
; i
++)
99 /* move past preceding quote */
104 LPSTR lpStart
= lpStr
;
106 while (*lpStr
!= '%' && *lpStr
!= '\0')
112 if (!SendQuote(sock
, lpStart
))
113 LogEvent(L
"QOTD: Error sending data", 0, 0, LOG_FILE
);
118 while (*lpStr
!= '%' && *lpStr
!= '\0')
121 /* move past % and RN */
126 HeapFree(GetProcessHeap(), 0, lpQuotes
);
135 QotdHandler(VOID
* sock_
)
137 SOCKET sock
= (SOCKET
)sock_
;
140 if (!RetrieveQuote(sock
))
142 LogEvent(L
"QOTD: Error retrieving quote", 0, 0, LOG_FILE
);
146 LogEvent(L
"QOTD: Shutting connection down", 0, 0, LOG_FILE
);
147 if (ShutdownConnection(sock
, FALSE
))
149 LogEvent(L
"QOTD: Connection is down", 0, 0, LOG_FILE
);
153 LogEvent(L
"QOTD: Connection shutdown failed", 0, 0, LOG_FILE
);
154 LogEvent(L
"QOTD: Terminating thread", 0, 0, LOG_FILE
);
158 LogEvent(L
"QOTD: Terminating thread", 0, 0, LOG_FILE
);