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

# Line 11 | Line 11
11  
12   #include <iostream>
13   #include <string>
14 + #include <sstream>
15   #include <vector>
16 + #include <set>
17 +
18 + inline std::string Utf8(const std::wstring &wstring)
19 + {
20 +        std::string string(::WideCharToMultiByte(CP_UTF8, 0, wstring.data(), int(wstring.size()), NULL, 0, NULL, NULL), '\0');
21 +
22 +        ::WideCharToMultiByte(CP_UTF8, 0, wstring.data(), int(wstring.size()), const_cast<LPSTR>(string.data()), int(string.size()), NULL, NULL);
23 +
24 +        return string;
25 + }
26 +
27 + class Finger
28 + {
29 + private:
30 +        struct Login
31 +        {
32 +                std::string login, name, session;
33 +                Login(const std::string &login, const std::string &session) : login(login), session(session)
34 +                {
35 +                }
36 +                bool operator<(const Login &login) const
37 +                {
38 +                        if (this->login == login.login)
39 +                                return session < login.session;
40 +                        else
41 +                                return this->login < login.login;
42 +                }
43 +        };
44 +        std::ostringstream stream;
45 +        std::set<Login> logins;
46 +
47 + public:
48 +        Finger(bool full)
49 +        {
50 +                PWTS_SESSION_INFO sessions;
51 +                DWORD count;
52 +
53 +                ::WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessions, &count);
54 +
55 +                for (PWTS_SESSION_INFO session(sessions); session != sessions + count; ++session)
56 +                {
57 +                        LPTSTR name;
58 +                        DWORD size;
59 +
60 +                        ::WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSUserName, &name, &size);
61 +
62 +                        if (!std::wstring(name).empty())
63 +                        {
64 +                                LPTSTR session_;
65 +
66 +                                ::WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSWinStationName, &session_, &size);
67 +
68 +                                Login login(Utf8(name), Utf8(session_));
69 +
70 +                                ::WTSFreeMemory(session_);
71 +
72 +                                logins.insert(login);
73 +                        }
74 +
75 +                        ::WTSFreeMemory(name);
76 +                }
77 +
78 +                ::WTSFreeMemory(sessions);
79 +
80 +                if (!full)
81 +                {
82 +                        stream << "Login\t\tName" << std::string(17, ' ') << "Session\r\n";
83 +
84 +                        for (std::set<Login>::const_iterator login(logins.begin()); login != logins.end(); ++login)
85 +                                stream << login->login << std::string(16 - login->login.size(), ' ') << login->name << std::string(21 - login->name.size(), ' ') << login->session << "\r\n";
86 +                }
87 +        }
88 +
89 +        Finger(const std::string &name)
90 +        {
91 +                //NetQueryDisplayInformation
92 +                //NetUserGetInfo
93 +        }
94 +
95 +        inline operator std::string()
96 +        {
97 +                return stream.str();
98 +        }
99 + };
100  
101   LPTSTR name;
102   SERVICE_STATUS status;
# Line 31 | Line 116 | int _tmain(int argc, TCHAR *argv[])
116   {
117          SERVICE_TABLE_ENTRY entry[] = { { TEXT("CCS Finger Daemon"), LPSERVICE_MAIN_FUNCTION(FingerMain) }, { NULL, NULL } };
118  
119 <        if (!StartServiceCtrlDispatcher(entry))
119 >        if (!::StartServiceCtrlDispatcher(entry))
120          {
121 <                DWORD error(GetLastError());
121 >                DWORD error(::GetLastError());
122  
123                  switch (error)
124                  {
# Line 60 | Line 145 | int _tmain(int argc, TCHAR *argv[])
145          return 0;
146  
147   go:
148 <        stop = CreateEvent(NULL, TRUE, FALSE, NULL);
148 >        stop = ::CreateEvent(NULL, TRUE, FALSE, NULL);
149  
150 <        signal(SIGINT, FingerStop);
150 >        ::signal(SIGINT, FingerStop);
151  
152          try
153          {
# Line 75 | Line 160 | go:
160  
161   void FingerDaemon()
162   {
163 <        WSAStartup(MAKEWORD(2, 0), &data);
163 >        ::WSAStartup(MAKEWORD(2, 0), &data);
164  
165          //
166  
167 <        SOCKET server(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
167 >        SOCKET server(::socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
168          SOCKADDR_IN service;
169          
170          service.sin_family = AF_INET;
171          service.sin_addr.s_addr = inet_addr("0.0.0.0");
172          service.sin_port = htons(79);
173  
174 <        bind(server, (SOCKADDR *)(&service), sizeof (service));
175 <        listen(server, SOMAXCONN);
174 >        ::bind(server, (SOCKADDR *)(&service), sizeof (service));
175 >        ::listen(server, SOMAXCONN);
176  
177 <        threads.push_back(CreateThread(NULL, 0, FingerListen, &server, 0, NULL));
177 >        threads.push_back(::CreateThread(NULL, 0, FingerListen, &server, 0, NULL));
178  
179 <        while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0);
179 >        while(::WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0);
180  
181          //
182  
183 <        closesocket(server);
183 >        ::closesocket(server);
184  
185 <        WSACleanup();
185 >        ::WSACleanup();
186   }
187  
188   DWORD WINAPI FingerListen(LPVOID server_)
# Line 108 | Line 193 | DWORD WINAPI FingerListen(LPVOID server_
193          {
194                  SOCKET client(accept(server, NULL, NULL));
195  
196 <                threads.push_back(CreateThread(NULL, 0, FingerDo, &client, 0, NULL));
196 >                threads.push_back(::CreateThread(NULL, 0, FingerDo, &client, 0, NULL));
197          }
198  
199          return 0;
# Line 117 | Line 202 | DWORD WINAPI FingerListen(LPVOID server_
202   DWORD WINAPI FingerDo(LPVOID client_)
203   {
204          SOCKET &client(*reinterpret_cast<SOCKET *>(client_));
205 <        char buffer;
206 <        std::string name;
207 <
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 <        }
205 >        char buffer[1024];
206 >        std::istringstream stream(std::string(buffer, ::recv(client, buffer, sizeof buffer, 0)));
207 >        std::string line;
208  
209 <        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);
209 >        std::getline(stream, line);
210  
211 <                        std::wcout << '{' << std::endl
160 <                                << '\t' << session->SessionId << std::endl
161 <                                << '\t' << session->pWinStationName << std::endl
162 <                                << '\t';
211 >        stream.str(line);
212  
213 <                        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";
213 >        std::getline(stream, line, '\r');
214  
215 <                                break;
206 <                        }
215 >        stream.str(line);
216  
217 <                        std::wcout << std::endl << '\t' << userName << std::endl
218 <                                << '\t' << clientName << std::endl
210 <                                << '}' << std::endl;
217 >        std::string name;
218 >        bool full(false);
219  
220 <                        WTSFreeMemory(userName);
221 <                        WTSFreeMemory(clientName);
222 <                }
220 >        while (stream >> line)
221 >                if (line == "/W")
222 >                        full = true;
223 >                else
224 >                        name = line;
225  
226 <                WTSFreeMemory(sessions);*/
217 <        }
226 >        std::string finger(name.empty() ? Finger(full) : Finger(name));
227  
228 <        closesocket(client);
228 >        ::send(client, finger.data(), int(finger.size()), 0);
229 >        ::closesocket(client);
230  
231          return 0;
232   }
233  
234   void FingerStop(int)
235   {
236 <        SetEvent(stop);
227 <
228 <        std::cout << "Stop!" << std::endl;
236 >        ::SetEvent(stop);
237   }
238  
239   void WINAPI FingerMain(DWORD argc, LPTSTR *argv)
240   {
241          name = argv[0];
242          handle = RegisterServiceCtrlHandler(name, LPHANDLER_FUNCTION(FingerControl));
243 <        stop = CreateEvent(NULL, TRUE, FALSE, NULL);
243 >        stop = ::CreateEvent(NULL, TRUE, FALSE, NULL);
244  
245          //
246  
# Line 244 | Line 252 | void WINAPI FingerMain(DWORD argc, LPTST
252          status.dwCheckPoint = 0;
253          status.dwWaitHint = 0;
254  
255 <        SetServiceStatus(handle, &status);
255 >        ::SetServiceStatus(handle, &status);
256  
257          try
258          {
# Line 257 | Line 265 | void WINAPI FingerMain(DWORD argc, LPTST
265          status.dwCheckPoint = 0;
266          status.dwWaitHint = 0;
267  
268 <        SetServiceStatus(handle, &status);
268 >        ::SetServiceStatus(handle, &status);
269   }
270  
271   void WINAPI FingerControl(DWORD control)
# Line 268 | Line 276 | void WINAPI FingerControl(DWORD control)
276          case SERVICE_CONTROL_SHUTDOWN:
277                  status.dwCurrentState = SERVICE_STOP_PENDING;
278  
279 <                SetEvent(stop);
279 >                ::SetEvent(stop);
280  
281                  break;
282  
# Line 276 | Line 284 | void WINAPI FingerControl(DWORD control)
284                  break;
285          }
286  
287 <        SetServiceStatus(handle, &status);
287 >        ::SetServiceStatus(handle, &status);
288   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines