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 607 by douglas, 2005-11-27T18:58:37-08:00 vs.
Revision 608 by douglas, 2005-11-30T18:23:39-08:00

# Line 7 | Line 7
7   #include <windows.h>
8   #include <tchar.h>
9   #include <signal.h>
10 + #include <wtsapi32.h>
11  
12   #include <iostream>
13 + #include <string>
14  
15   LPTSTR name;
16   SERVICE_STATUS status;
# Line 23 | Line 25 | void WINAPI FingerControl(DWORD control)
25  
26   int _tmain(int argc, TCHAR *argv[])
27   {
28 <        SERVICE_TABLE_ENTRY entry[] = { { TEXT("CCS Finger Daemon"), LPSERVICE_MAIN_FUNCTION(FingerMain) }, { NULL, NULL } };
28 >        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 } };
106  
107          if (!StartServiceCtrlDispatcher(entry))
108          {
# Line 54 | Line 133 | int _tmain(int argc, TCHAR *argv[])
133          return 0;
134  
135   go:
136 +        stop = CreateEvent(NULL, TRUE, FALSE, NULL);
137 +
138          signal(SIGINT, FingerStop);
139  
140          try
# Line 62 | Line 143 | go:
143          }
144          catch (...) {}
145  
146 <        return 0;
146 >        return 0;*/
147   }
148  
149   void FingerDaemon()
# Line 71 | Line 152 | void FingerDaemon()
152  
153          //
154  
155 <        SOCKET sock(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
155 >        SOCKET server(socket(PF_INET, SOCK_STREAM, IPPROTO_TCP));
156          SOCKADDR_IN service;
157          
158          service.sin_family = AF_INET;
159          service.sin_addr.s_addr = inet_addr("0.0.0.0");
160          service.sin_port = htons(79);
161  
162 <        bind(sock, (SOCKADDR *)(&service), sizeof (service));
163 <        listen(sock, SOMAXCONN);
162 >        bind(server, (SOCKADDR *)(&service), sizeof (service));
163 >        listen(server, SOMAXCONN);
164  
165 <        while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0 /*&&*/)
165 >        SOCKET client;
166 >
167 >        while(WaitForSingleObject(stop, 1000) != WAIT_OBJECT_0 && (client = accept(server, NULL, NULL)) == SOCKET_ERROR)
168          {
169                  //
170          }
171  
172          //
173  
174 +        closesocket(server);
175 +
176          WSACleanup();
177   }
178  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines