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

# User Rev Content
1 douglas 594 // Douglas Thrift
2     //
3     // CCS Computer Science
4     //
5     // Windows Finger Daemon
6    
7     #include <windows.h>
8     #include <tchar.h>
9 douglas 596 #include <signal.h>
10 douglas 594
11 douglas 595 #include <iostream>
12    
13     LPTSTR name;
14 douglas 594 SERVICE_STATUS status;
15     SERVICE_STATUS_HANDLE handle;
16 douglas 595 HANDLE stop;
17 douglas 594 WSADATA data;
18    
19 douglas 596 void FingerDaemon();
20     void FingerStop(int);
21 douglas 595 void WINAPI FingerMain(DWORD argc, LPTSTR *argv);
22     void WINAPI FingerControl(DWORD control);
23 douglas 594
24     int _tmain(int argc, TCHAR *argv[])
25     {
26 douglas 595 SERVICE_TABLE_ENTRY entry[] = { { TEXT("CCS Finger Daemon"), LPSERVICE_MAIN_FUNCTION(FingerMain) }, { NULL, NULL } };
27 douglas 594
28     if (!StartServiceCtrlDispatcher(entry))
29     {
30     DWORD error(GetLastError());
31    
32     switch (error)
33     {
34     case ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
35 douglas 595 goto go;
36 douglas 594
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 douglas 595
56     go:
57 douglas 596 signal(SIGINT, FingerStop);
58 douglas 595
59 douglas 596 try
60     {
61     FingerDaemon();
62     }
63     catch (...) {}
64    
65 douglas 595 return 0;
66 douglas 594 }
67    
68 douglas 596 void FingerDaemon()
69 douglas 594 {
70     WSAStartup(MAKEWORD(2, 0), &data);
71    
72     //
73    
74 douglas 595 SOCKET sock(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
75 douglas 594 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 douglas 595 while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0 /*&&*/)
85 douglas 594 {
86     //
87     }
88    
89     //
90    
91     WSACleanup();
92 douglas 596 }
93 douglas 594
94 douglas 596 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 douglas 595 status.dwCurrentState = SERVICE_STOPPED;
126 douglas 594 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 douglas 595 SetServiceStatus(handle, &status);
150 douglas 594 }