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 608 by douglas, 2005-11-30T18:23:39-08:00 vs.
Revision 609 by douglas, 2005-11-30T21:55:40-08:00

# Line 11 | Line 11
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  
30   int _tmain(int argc, TCHAR *argv[])
31   {
32 <        PWTS_SESSION_INFO sessions;
29 <        DWORD count;
30 <
31 <        if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessions, &count))
32 <        {
33 <                std::cerr << GetLastError() << std::endl;
34 <
35 <                return 1;
36 <        }
37 <
38 <        for (PWTS_SESSION_INFO session = sessions; session != sessions + count; ++session)
39 <        {
40 <                LPTSTR userName, clientName;
41 <                DWORD userNameSize, clientNameSize;
42 <
43 <                WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSUserName, &userName, &userNameSize);
44 <                WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSClientName, &clientName, &clientNameSize);
45 <
46 <                std::wcout << '{' << std::endl
47 <                        << '\t' << session->SessionId << std::endl
48 <                        << '\t' << session->pWinStationName << std::endl
49 <                        << '\t';
50 <
51 <                switch (session->State)
52 <                {
53 <                case WTSActive:
54 <                        std::cout << "Active";
55 <                        
56 <                        break;
57 <                case WTSConnected:
58 <                        std::cout << "Connected";
59 <
60 <                        break;
61 <                case WTSConnectQuery:
62 <                        std::cout << "Connect Query";
63 <
64 <                        break;
65 <                case WTSShadow:
66 <                        std::cout << "Shadow";
67 <
68 <                        break;
69 <                case WTSDisconnected:
70 <                        std::cout << "Disconnected";
71 <
72 <                        break;
73 <                case WTSIdle:
74 <                        std::cout << "Idle";
75 <
76 <                        break;
77 <                case WTSListen:
78 <                        std::cout << "Listen";
79 <
80 <                        break;
81 <                case WTSReset:
82 <                        std::cout << "Reset";
83 <
84 <                        break;
85 <                case WTSDown:
86 <                        std::cout << "Down";
87 <
88 <                        break;
89 <                case WTSInit:
90 <                        std::cout << "Init";
91 <
92 <                        break;
93 <                }
94 <
95 <                std::wcout << std::endl << '\t' << userName << std::endl
96 <                        << '\t' << clientName << std::endl
97 <                        << '}' << std::endl;
98 <
99 <                WTSFreeMemory(userName);
100 <                WTSFreeMemory(clientName);
101 <        }
102 <
103 <        WTSFreeMemory(sessions);
104 <
105 <        /*SERVICE_TABLE_ENTRY entry[] = { { TEXT("CCS Finger Daemon"), LPSERVICE_MAIN_FUNCTION(FingerMain) }, { NULL, NULL } };
32 >        SERVICE_TABLE_ENTRY entry[] = { { TEXT("CCS Finger Daemon"), LPSERVICE_MAIN_FUNCTION(FingerMain) }, { NULL, NULL } };
33  
34          if (!StartServiceCtrlDispatcher(entry))
35          {
# Line 143 | Line 70 | go:
70          }
71          catch (...) {}
72  
73 <        return 0;*/
73 >        return 0;
74   }
75  
76   void FingerDaemon()
# Line 162 | Line 89 | void FingerDaemon()
89          bind(server, (SOCKADDR *)(&service), sizeof (service));
90          listen(server, SOMAXCONN);
91  
92 <        SOCKET client;
92 >        threads.push_back(CreateThread(NULL, 0, FingerListen, &server, 0, NULL));
93  
94 <        while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0 && (client = accept(server, NULL, NULL)) == SOCKET_ERROR)
168 <        {
169 <                //
170 <        }
94 >        while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0);
95  
96          //
97  
# Line 176 | Line 100 | void FingerDaemon()
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);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines