2 Samba Unix/Linux SMB client library
3 net status command -- possible replacement for smbstatus
4 Copyright (C) 2003 Volker Lendecke (vl@samba.org)
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21 #include "utils/net.h"
23 static int show_session(TDB_CONTEXT
*tdb
, TDB_DATA kbuf
, TDB_DATA dbuf
,
26 BOOL
*parseable
= (BOOL
*)state
;
27 struct sessionid sessionid
;
29 if (dbuf
.dsize
!= sizeof(sessionid
))
32 memcpy(&sessionid
, dbuf
.dptr
, sizeof(sessionid
));
34 if (!process_exists_by_pid(sessionid
.pid
)) {
39 d_printf("%d\\%s\\%s\\%s\\%s\n",
40 (int)sessionid
.pid
, uidtoname(sessionid
.uid
),
41 gidtoname(sessionid
.gid
),
42 sessionid
.remote_machine
, sessionid
.hostname
);
44 d_printf("%5d %-12s %-12s %-12s (%s)\n",
45 (int)sessionid
.pid
, uidtoname(sessionid
.uid
),
46 gidtoname(sessionid
.gid
),
47 sessionid
.remote_machine
, sessionid
.hostname
);
53 static int net_status_sessions(int argc
, const char **argv
)
60 } else if ((argc
== 1) && strequal(argv
[0], "parseable")) {
63 return net_help_status(argc
, argv
);
67 d_printf("PID Username Group Machine"
69 d_printf("-------------------------------------------"
70 "------------------------\n");
73 tdb
= tdb_open_log(lock_path("sessionid.tdb"), 0,
74 TDB_DEFAULT
, O_RDONLY
, 0);
77 d_fprintf(stderr
, "%s not initialised\n", lock_path("sessionid.tdb"));
81 tdb_traverse(tdb
, show_session
, &parseable
);
87 static int show_share(TDB_CONTEXT
*tdb
, TDB_DATA kbuf
, TDB_DATA dbuf
,
90 struct connections_data crec
;
92 if (dbuf
.dsize
!= sizeof(crec
))
95 memcpy(&crec
, dbuf
.dptr
, sizeof(crec
));
100 if (!process_exists(crec
.pid
)) {
104 d_printf("%-10.10s %s %-12s %s",
105 crec
.servicename
,procid_str_static(&crec
.pid
),
107 time_to_asc(crec
.start
));
114 struct sessionid
*entries
;
117 static int collect_pid(TDB_CONTEXT
*tdb
, TDB_DATA kbuf
, TDB_DATA dbuf
,
120 struct sessionids
*ids
= (struct sessionids
*)state
;
121 struct sessionid sessionid
;
123 if (dbuf
.dsize
!= sizeof(sessionid
))
126 memcpy(&sessionid
, dbuf
.dptr
, sizeof(sessionid
));
128 if (!process_exists_by_pid(sessionid
.pid
))
131 ids
->num_entries
+= 1;
132 ids
->entries
= SMB_REALLOC_ARRAY(ids
->entries
, struct sessionid
, ids
->num_entries
);
134 ids
->num_entries
= 0;
137 ids
->entries
[ids
->num_entries
-1] = sessionid
;
142 static int show_share_parseable(TDB_CONTEXT
*tdb
, TDB_DATA kbuf
, TDB_DATA dbuf
,
145 struct sessionids
*ids
= (struct sessionids
*)state
;
146 struct connections_data crec
;
150 if (dbuf
.dsize
!= sizeof(crec
))
153 memcpy(&crec
, dbuf
.dptr
, sizeof(crec
));
158 if (!process_exists(crec
.pid
)) {
162 for (i
=0; i
<ids
->num_entries
; i
++) {
163 struct process_id id
= pid_to_procid(ids
->entries
[i
].pid
);
164 if (procid_equal(&id
, &crec
.pid
)) {
170 d_printf("%s\\%s\\%s\\%s\\%s\\%s\\%s",
171 crec
.servicename
,procid_str_static(&crec
.pid
),
172 guest
? "" : uidtoname(ids
->entries
[i
].uid
),
173 guest
? "" : gidtoname(ids
->entries
[i
].gid
),
175 guest
? "" : ids
->entries
[i
].hostname
,
176 time_to_asc(crec
.start
));
181 static int net_status_shares_parseable(int argc
, const char **argv
)
183 struct sessionids ids
;
189 tdb
= tdb_open_log(lock_path("sessionid.tdb"), 0,
190 TDB_DEFAULT
, O_RDONLY
, 0);
193 d_fprintf(stderr
, "%s not initialised\n", lock_path("sessionid.tdb"));
197 tdb_traverse(tdb
, collect_pid
, &ids
);
200 tdb
= tdb_open_log(lock_path("connections.tdb"), 0,
201 TDB_DEFAULT
, O_RDONLY
, 0);
204 d_fprintf(stderr
, "%s not initialised\n", lock_path("connections.tdb"));
205 d_fprintf(stderr
, "This is normal if no SMB client has ever "
206 "connected to your server.\n");
210 tdb_traverse(tdb
, show_share_parseable
, &ids
);
213 SAFE_FREE(ids
.entries
);
218 static int net_status_shares(int argc
, const char **argv
)
224 d_printf("\nService pid machine "
226 d_printf("-------------------------------------"
227 "------------------\n");
229 tdb
= tdb_open_log(lock_path("connections.tdb"), 0,
230 TDB_DEFAULT
, O_RDONLY
, 0);
233 d_fprintf(stderr
, "%s not initialised\n",
234 lock_path("connections.tdb"));
235 d_fprintf(stderr
, "This is normal if no SMB client has "
236 "ever connected to your server.\n");
240 tdb_traverse(tdb
, show_share
, NULL
);
246 if ((argc
!= 1) || !strequal(argv
[0], "parseable")) {
247 return net_help_status(argc
, argv
);
250 return net_status_shares_parseable(argc
, argv
);
253 int net_status(int argc
, const char **argv
)
255 struct functable func
[] = {
256 {"sessions", net_status_sessions
},
257 {"shares", net_status_shares
},
260 return net_run_function(argc
, argv
, func
, net_help_status
);