ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/CCSFinger/CCSFinger.cpp
(Generate patch)

Comparing CCSFinger/CCSFinger.cpp (file contents):
Revision 594 by douglas, 2005-11-27T17:04:53-08:00 vs.
Revision 596 by douglas, 2005-11-27T18:58:37-08:00

# Line 6 | Line 6
6  
7   #include <windows.h>
8   #include <tchar.h>
9 + #include <signal.h>
10  
11 < /*LPTSTR name;
11 > #include <iostream>
12 >
13 > LPTSTR name;
14   SERVICE_STATUS status;
15   SERVICE_STATUS_HANDLE handle;
16 < HANDLE stop;*/
16 > HANDLE stop;
17   WSADATA data;
18  
19 < /*void WINAPI FingerMain(DWORD argc, LPTSTR *argv);
20 < void WINAPI FingerControl(DWORD control);*/
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 } };
26 >        SERVICE_TABLE_ENTRY entry[] = { { TEXT("CCS Finger Daemon"), LPSERVICE_MAIN_FUNCTION(FingerMain) }, { NULL, NULL } };
27  
28          if (!StartServiceCtrlDispatcher(entry))
29          {
# Line 27 | Line 32 | int _tmain(int argc, TCHAR *argv[])
32                  switch (error)
33                  {
34                  case ERROR_FAILED_SERVICE_CONTROLLER_CONNECT:
35 <                        std::cerr << "ERROR_FAILED_SERVICE_CONTROLLER_CONNECT" << std::endl;
31 <
32 <                        break;
35 >                        goto go;
36  
37                  case ERROR_INVALID_DATA:
38                          std::cerr << "ERROR_INVALID_DATA" << std::endl;
# Line 49 | Line 52 | int _tmain(int argc, TCHAR *argv[])
52          }
53  
54          return 0;
52 }
55  
56 < void WINAPI FingerMain(DWORD argc, LPTSTR *argv)
57 < {
58 <        name = argv[0];
59 <        handle = RegisterServiceCtrlHandler(name, LPHANDLER_FUNCTION(FingerControl));
60 <        stop = CreateEvent(NULL, TRUE, FALSE, NULL);
56 > go:
57 >        signal(SIGINT, FingerStop);
58 >
59 >        try
60 >        {
61 >                FingerDaemon();
62 >        }
63 >        catch (...) {}
64  
65 <        //*/
65 >        return 0;
66 > }
67  
68 + void FingerDaemon()
69 + {
70          WSAStartup(MAKEWORD(2, 0), &data);
71  
72          //
73  
74 <        /*status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
67 <        status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
68 <        status.dwServiceSpecificExitCode = 0;
69 <        status.dwCurrentState = SERVICE_RUNNING;
70 <        status.dwWin32ExitCode = NO_ERROR;
71 <        status.dwCheckPoint = 0;
72 <        status.dwWaitHint = 0;
73 <
74 <        SetServiceStatus(handle, &status);*/
75 <
76 <        SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
74 >        SOCKET sock(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
75          SOCKADDR_IN service;
76          
77          service.sin_family = AF_INET;
# Line 83 | Line 81 | void WINAPI FingerMain(DWORD argc, LPTST
81          bind(sock, (SOCKADDR *)(&service), sizeof (service));
82          listen(sock, SOMAXCONN);
83  
84 <        //while(/*WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0*/ /*&&*/)
84 >        while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0 /*&&*/)
85          {
86                  //
87          }
# Line 91 | Line 89 | void WINAPI FingerMain(DWORD argc, LPTST
89          //
90  
91          WSACleanup();
92 + }
93 +
94 + void FingerStop(int)
95 + {
96 +        SetEvent(stop);
97  
98 <        /*status.dwCurrentState = SERVICE_STOPPED;
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;
# Line 116 | Line 146 | void WINAPI FingerControl(DWORD control)
146                  break;
147          }
148  
149 <        SetServiceStatus(handle, &status);*/
120 <
121 <        return 0;
149 >        SetServiceStatus(handle, &status);
150   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines