ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/CCSFinger/CCSFinger.cpp
Revision: 595
Committed: 2005-11-27T17:57:41-08:00 (19 years, 7 months ago) by douglas
File size: 2502 byte(s)
Log Message:
Meep!

File Contents

# Content
1 // Douglas Thrift
2 //
3 // CCS Computer Science
4 //
5 // Windows Finger Daemon
6
7 #include <windows.h>
8 #include <tchar.h>
9
10 #include <iostream>
11
12 LPTSTR name;
13 SERVICE_STATUS status;
14 SERVICE_STATUS_HANDLE handle;
15 HANDLE stop;
16 WSADATA data;
17
18 void WINAPI FingerMain(DWORD argc, LPTSTR *argv);
19 void WINAPI FingerControl(DWORD control);
20
21 int _tmain(int argc, TCHAR *argv[])
22 {
23 SERVICE_TABLE_ENTRY entry[] = { { TEXT("CCS Finger Daemon"), LPSERVICE_MAIN_FUNCTION(FingerMain) }, { NULL, NULL } };
24
25 if (!StartServiceCtrlDispatcher(entry))
26 {
27 DWORD error(GetLastError());
28
29 switch (error)
30 {
31 case ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
32 goto go;
33
34 case ERROR_INVALID_DATA:
35 std::cerr << "ERROR_INVALID_DATA" << std::endl;
36
37 break;
38
39 case ERROR_SERVICE_ALREADY_RUNNING:
40 std::cerr << "ERROR_SERVICE_ALREADY_RUNNING" << std::endl;
41
42 break;
43
44 default:
45 std::cerr << error << std::endl;
46 }
47
48 return 1;
49 }
50
51 return 0;
52
53 go:
54 std::cout << "Here!" << std::endl;
55
56 return 0;
57 }
58
59 void WINAPI FingerMain(DWORD argc, LPTSTR *argv)
60 {
61 name = argv[0];
62 handle = RegisterServiceCtrlHandler(name, LPHANDLER_FUNCTION(FingerControl));
63 stop = CreateEvent(NULL, TRUE, FALSE, NULL);
64
65 //
66
67 WSAStartup(MAKEWORD(2, 0), &data);
68
69 //
70
71 status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
72 status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
73 status.dwServiceSpecificExitCode = 0;
74 status.dwCurrentState = SERVICE_RUNNING;
75 status.dwWin32ExitCode = NO_ERROR;
76 status.dwCheckPoint = 0;
77 status.dwWaitHint = 0;
78
79 SetServiceStatus(handle, &status);
80
81 SOCKET sock(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
82 SOCKADDR_IN service;
83
84 service.sin_family = AF_INET;
85 service.sin_addr.s_addr = inet_addr("0.0.0.0");
86 service.sin_port = htons(79);
87
88 bind(sock, (SOCKADDR *)(&service), sizeof (service));
89 listen(sock, SOMAXCONN);
90
91 while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0 /*&&*/)
92 {
93 //
94 }
95
96 //
97
98 WSACleanup();
99
100 status.dwCurrentState = SERVICE_STOPPED;
101 status.dwWin32ExitCode = NO_ERROR;
102 status.dwCheckPoint = 0;
103 status.dwWaitHint = 0;
104
105 SetServiceStatus(handle, &status);
106 }
107
108 void WINAPI FingerControl(DWORD control)
109 {
110 switch (control)
111 {
112 case SERVICE_CONTROL_STOP:
113 case SERVICE_CONTROL_SHUTDOWN:
114 status.dwCurrentState = SERVICE_STOP_PENDING;
115
116 SetEvent(stop);
117
118 break;
119
120 case SERVICE_CONTROL_INTERROGATE:
121 break;
122 }
123
124 SetServiceStatus(handle, &status);
125 }