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

# 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    
10 douglas 595 #include <iostream>
11    
12     LPTSTR name;
13 douglas 594 SERVICE_STATUS status;
14     SERVICE_STATUS_HANDLE handle;
15 douglas 595 HANDLE stop;
16 douglas 594 WSADATA data;
17    
18 douglas 595 void WINAPI FingerMain(DWORD argc, LPTSTR *argv);
19     void WINAPI FingerControl(DWORD control);
20 douglas 594
21     int _tmain(int argc, TCHAR *argv[])
22     {
23 douglas 595 SERVICE_TABLE_ENTRY entry[] = { { TEXT("CCS Finger Daemon"), LPSERVICE_MAIN_FUNCTION(FingerMain) }, { NULL, NULL } };
24 douglas 594
25     if (!StartServiceCtrlDispatcher(entry))
26     {
27     DWORD error(GetLastError());
28    
29     switch (error)
30     {
31     case ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
32 douglas 595 goto go;
33 douglas 594
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 douglas 595
53     go:
54     std::cout << "Here!" << std::endl;
55    
56     return 0;
57 douglas 594 }
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 douglas 595 //
66 douglas 594
67     WSAStartup(MAKEWORD(2, 0), &data);
68    
69     //
70    
71 douglas 595 status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
72 douglas 594 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 douglas 595 SetServiceStatus(handle, &status);
80 douglas 594
81 douglas 595 SOCKET sock(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
82 douglas 594 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 douglas 595 while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0 /*&&*/)
92 douglas 594 {
93     //
94     }
95    
96     //
97    
98     WSACleanup();
99    
100 douglas 595 status.dwCurrentState = SERVICE_STOPPED;
101 douglas 594 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 douglas 595 SetServiceStatus(handle, &status);
125 douglas 594 }