ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/CCSFinger/CCSFinger.cpp
Revision: 596
Committed: 2005-11-27T18:58:37-08:00 (19 years, 7 months ago) by douglas
File size: 2779 byte(s)
Log Message:
Go!

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