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>
12 static WCHAR szFilePath
[] = L
"\\drivers\\etc\\quotes";
15 SendQuote(SOCKET sock
, char* Quote
)
17 INT strSize
= strlen(Quote
);
18 if (send(sock
, Quote
, strSize
, 0) == SOCKET_ERROR
)
25 RetrieveQuote(SOCKET sock
)
28 WCHAR szFullPath
[MAX_PATH
+ 20];
36 if(!GetSystemDirectoryW(szFullPath
, MAX_PATH
))
38 LogEvent(L
"QOTD: Getting system path failed", GetLastError(), 0, LOG_FILE
);
41 wcscat(szFullPath
, szFilePath
);
44 LogEvent(L
"QOTD: Opening quotes file", 0, 0, LOG_FILE
);
45 hFile
= CreateFileW(szFullPath
,
50 FILE_ATTRIBUTE_NORMAL
,
52 if (hFile
== INVALID_HANDLE_VALUE
)
54 LogEvent(L
"QOTD: Error opening quotes file", GetLastError(), 0, LOG_FILE
);
58 DWORD dwSize
= GetFileSize(hFile
, NULL
);
59 lpQuotes
= (LPSTR
)HeapAlloc(GetProcessHeap(), 0, dwSize
);
75 if (dwBytesRead
!= dwSize
)
86 /* pick a random quote */
87 srand((unsigned int) GetTickCount());
88 quoteNum
= rand() % NumQuotes
;
90 /* retrieve the full quote */
92 for (i
= 1; i
<= quoteNum
; i
++)
94 /* move past proceding quote */
99 LPSTR lpStart
= lpStr
;
101 while (*lpStr
!= '%' && *lpStr
!= '\0')
107 if (!SendQuote(sock
, lpStart
))
108 LogEvent(L
"QOTD: Error sending data", 0, 0, LOG_FILE
);
113 while (*lpStr
!= '%' && *lpStr
!= '\0')
116 /* move past % and RN */
129 QotdHandler(VOID
* sock_
)
131 SOCKET sock
= (SOCKET
)sock_
;
134 if (!RetrieveQuote(sock
))
136 LogEvent(L
"QOTD: Error retrieving quote", 0, 0, LOG_FILE
);
140 LogEvent(L
"QOTD: Shutting connection down", 0, 0, LOG_FILE
);
141 if (ShutdownConnection(sock
, FALSE
))
143 LogEvent(L
"QOTD: Connection is down", 0, 0, LOG_FILE
);
147 LogEvent(L
"QOTD: Connection shutdown failed", 0, 0, LOG_FILE
);
148 LogEvent(L
"QOTD: Terminating thread", 0, 0, LOG_FILE
);
152 LogEvent(L
"QOTD: Terminating thread", 0, 0, LOG_FILE
);