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 611 by douglas, 2005-12-05T01:26:27-08:00

# Line 11 | Line 11
11  
12   #include <iostream>
13   #include <string>
14 + #include <sstream>
15   #include <vector>
16  
17 + inline std::string Utf8(const std::wstring &wstring)
18 + {
19 +        std::string string(WideCharToMultiByte(CP_UTF8, 0, wstring.data(), int(wstring.size()), NULL, 0, NULL, NULL), '\0');
20 +
21 +        WideCharToMultiByte(CP_UTF8, 0, wstring.data(), int(wstring.size()), const_cast<LPSTR>(string.data()), int(string.size()), NULL, NULL);
22 +
23 +        return string;
24 + }
25 +
26 + class Finger
27 + {
28 + private:
29 +        std::ostringstream stream;
30 +
31 + public:
32 +        Finger(bool full)
33 +        {
34 +                if (!full)
35 +                        stream << "Login\t\tName\t\tTTY\r\n";
36 +
37 +                PWTS_SESSION_INFO sessions;
38 +                DWORD count;
39 +
40 +                WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessions, &count);
41 +
42 +                for (PWTS_SESSION_INFO session = sessions; session != sessions + count; ++session)
43 +                {
44 +                        LPTSTR name;
45 +                        DWORD size;
46 +
47 +                        WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSUserName, &name, &size);
48 +
49 +                        std::string name_(Utf8(name));
50 +
51 +                        if (!name_.empty())
52 +                                stream << name_ << "\r\n";
53 +
54 +                        WTSFreeMemory(name);
55 +
56 +                        //PWTS_CLIENT_ADDRESS address;
57 +                        //WTSQuerySessionInformation(WTS_CURRENT_SERVER_HANDLE, session->SessionId, WTSClientAddress, reinterpret_cast<LPTSTR *>(&address), &size);
58 +                        //WTSFreeMemory(address);
59 +                }
60 +
61 +                WTSFreeMemory(sessions);
62 +        }
63 +
64 +        Finger(const std::string &name)
65 +        {
66 +        }
67 +
68 +        inline operator std::string()
69 +        {
70 +                return stream.str();
71 +        }
72 + };
73 +
74   LPTSTR name;
75   SERVICE_STATUS status;
76   SERVICE_STATUS_HANDLE handle;
# Line 117 | Line 175 | DWORD WINAPI FingerListen(LPVOID server_
175   DWORD WINAPI FingerDo(LPVOID client_)
176   {
177          SOCKET &client(*reinterpret_cast<SOCKET *>(client_));
178 <        char buffer;
179 <        std::string name;
178 >        char buffer[1024];
179 >        std::istringstream stream(std::string(buffer, recv(client, buffer, sizeof buffer, 0)));
180 >        std::string line;
181  
182 <        while (recv(client, &buffer, 1, 0) > 0)
124 <        {
125 <                name += buffer;
182 >        std::getline(stream, line);
183  
184 <                if (name.size() >= 2 && name.rfind("\r\n") == name.size() - 2)
128 <                {
129 <                        name.erase(name.size() - 2);
184 >        stream.str(line);
185  
186 <                        break;
132 <                }
133 <        }
186 >        std::getline(stream, line, '\r');
187  
188 <        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;
188 >        stream.str(line);
189  
190 <                if (!WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &sessions, &count))
191 <                {
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;
190 >        std::string name;
191 >        bool full(false);
192  
193 <                        WTSFreeMemory(userName);
194 <                        WTSFreeMemory(clientName);
195 <                }
193 >        while (stream >> line)
194 >                if (line == "/W")
195 >                        full = true;
196 >                else
197 >                        name = line;
198  
199 <                WTSFreeMemory(sessions);*/
217 <        }
199 >        std::string finger(name.empty() ? Finger(full) : Finger(name));
200  
201 +        send(client, finger.data(), int(finger.size()), 0);
202          closesocket(client);
203  
204          return 0;
# Line 224 | Line 207 | DWORD WINAPI FingerDo(LPVOID client_)
207   void FingerStop(int)
208   {
209          SetEvent(stop);
227
228        std::cout << "Stop!" << std::endl;
210   }
211  
212   void WINAPI FingerMain(DWORD argc, LPTSTR *argv)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines