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 595 by douglas, 2005-11-27T17:57:41-08:00 vs.
Revision 609 by douglas, 2005-11-30T21:55:40-08:00

# Line 6 | Line 6
6  
7   #include <windows.h>
8   #include <tchar.h>
9 + #include <signal.h>
10 + #include <wtsapi32.h>
11  
12   #include <iostream>
13 + #include <string>
14 + #include <vector>
15  
16   LPTSTR name;
17   SERVICE_STATUS status;
18   SERVICE_STATUS_HANDLE handle;
19   HANDLE stop;
20   WSADATA data;
21 + std::vector<HANDLE> threads;
22  
23 + void FingerDaemon();
24 + DWORD WINAPI FingerListen(LPVOID server_);
25 + DWORD WINAPI FingerDo(LPVOID client_);
26 + void FingerStop(int);
27   void WINAPI FingerMain(DWORD argc, LPTSTR *argv);
28   void WINAPI FingerControl(DWORD control);
29  
# Line 51 | Line 60 | int _tmain(int argc, TCHAR *argv[])
60          return 0;
61  
62   go:
63 <        std::cout << "Here!" << std::endl;
63 >        stop = CreateEvent(NULL, TRUE, FALSE, NULL);
64 >
65 >        signal(SIGINT, FingerStop);
66 >
67 >        try
68 >        {
69 >                FingerDaemon();
70 >        }
71 >        catch (...) {}
72 >
73 >        return 0;
74 > }
75 >
76 > void FingerDaemon()
77 > {
78 >        WSAStartup(MAKEWORD(2, 0), &data);
79 >
80 >        //
81 >
82 >        SOCKET server(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
83 >        SOCKADDR_IN service;
84 >        
85 >        service.sin_family = AF_INET;
86 >        service.sin_addr.s_addr = inet_addr("0.0.0.0");
87 >        service.sin_port = htons(79);
88 >
89 >        bind(server, (SOCKADDR *)(&service), sizeof (service));
90 >        listen(server, SOMAXCONN);
91 >
92 >        threads.push_back(CreateThread(NULL, 0, FingerListen, &server, 0, NULL));
93 >
94 >        while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0);
95 >
96 >        //
97 >
98 >        closesocket(server);
99 >
100 >        WSACleanup();
101 > }
102 >
103 > DWORD WINAPI FingerListen(LPVOID server_)
104 > {
105 >        SOCKET &server(*reinterpret_cast<SOCKET *>(server_));
106 >
107 >        while (true)
108 >        {
109 >                SOCKET client(accept(server, NULL, NULL));
110 >
111 >                threads.push_back(CreateThread(NULL, 0, FingerDo, &client, 0, NULL));
112 >        }
113 >
114 >        return 0;
115 > }
116 >
117 > DWORD WINAPI FingerDo(LPVOID client_)
118 > {
119 >        SOCKET &client(*reinterpret_cast<SOCKET *>(client_));
120 >        char buffer;
121 >        std::string name;
122 >
123 >        while (recv(client, &buffer, 1, 0) > 0)
124 >        {
125 >                name += buffer;
126 >
127 >                if (name.size() >= 2 && name.rfind("\r\n") == name.size() - 2)
128 >                {
129 >                        name.erase(name.size() - 2);
130 >
131 >                        break;
132 >                }
133 >        }
134 >
135 >        if (name.empty())
136 >        {
137 >                std::string header("Login\t\tName\t\tTTY\r\n");
138 >
139 >                send(client, header.data(), header.size(), 0);
140 >                
141 >                /*PWTS_SESSION_INFO sessions;
142 >                DWORD count;
143 >
144 >                if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessions, &count))
145 >                {
146 >                        std::cerr << GetLastError() << std::endl;
147 >
148 >                        return 1;
149 >                }
150 >
151 >                for (PWTS_SESSION_INFO session = sessions; session != sessions + count; ++session)
152 >                {
153 >                        LPTSTR userName, clientName;
154 >                        DWORD userNameSize, clientNameSize;
155 >
156 >                        WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSUserName, &userName, &userNameSize);
157 >                        WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSClientName, &clientName, &clientNameSize);
158 >
159 >                        std::wcout << '{' << std::endl
160 >                                << '\t' << session->SessionId << std::endl
161 >                                << '\t' << session->pWinStationName << std::endl
162 >                                << '\t';
163 >
164 >                        switch (session->State)
165 >                        {
166 >                        case WTSActive:
167 >                                std::cout << "Active";
168 >                                
169 >                                break;
170 >                        case WTSConnected:
171 >                                std::cout << "Connected";
172 >
173 >                                break;
174 >                        case WTSConnectQuery:
175 >                                std::cout << "Connect Query";
176 >
177 >                                break;
178 >                        case WTSShadow:
179 >                                std::cout << "Shadow";
180 >
181 >                                break;
182 >                        case WTSDisconnected:
183 >                                std::cout << "Disconnected";
184 >
185 >                                break;
186 >                        case WTSIdle:
187 >                                std::cout << "Idle";
188 >
189 >                                break;
190 >                        case WTSListen:
191 >                                std::cout << "Listen";
192 >
193 >                                break;
194 >                        case WTSReset:
195 >                                std::cout << "Reset";
196 >
197 >                                break;
198 >                        case WTSDown:
199 >                                std::cout << "Down";
200 >
201 >                                break;
202 >                        case WTSInit:
203 >                                std::cout << "Init";
204 >
205 >                                break;
206 >                        }
207 >
208 >                        std::wcout << std::endl << '\t' << userName << std::endl
209 >                                << '\t' << clientName << std::endl
210 >                                << '}' << std::endl;
211 >
212 >                        WTSFreeMemory(userName);
213 >                        WTSFreeMemory(clientName);
214 >                }
215 >
216 >                WTSFreeMemory(sessions);*/
217 >        }
218 >
219 >        closesocket(client);
220  
221          return 0;
222   }
223  
224 + void FingerStop(int)
225 + {
226 +        SetEvent(stop);
227 +
228 +        std::cout << "Stop!" << std::endl;
229 + }
230 +
231   void WINAPI FingerMain(DWORD argc, LPTSTR *argv)
232   {
233          name = argv[0];
# Line 64 | Line 236 | void WINAPI FingerMain(DWORD argc, LPTST
236  
237          //
238  
67        WSAStartup(MAKEWORD(2, 0), &data);
68
69        //
70
239          status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
240          status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
241          status.dwServiceSpecificExitCode = 0;
# Line 78 | Line 246 | void WINAPI FingerMain(DWORD argc, LPTST
246  
247          SetServiceStatus(handle, &status);
248  
249 <        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 /*&&*/)
249 >        try
250          {
251 <                //
251 >                FingerDaemon();
252          }
253 <
96 <        //
97 <
98 <        WSACleanup();
253 >        catch (...) {}
254  
255          status.dwCurrentState = SERVICE_STOPPED;
256          status.dwWin32ExitCode = NO_ERROR;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines