2 Unix SMB/Netbios implementation.
5 Copyright (C) Andrew Tridgell 1994-1997
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 12 aug 96: Erik.Devriendt@te6.siemens.be
24 added support for shared memory implementation of share mode locking
28 * This program reports current SMB connections
37 struct connect_record crec
;
39 struct session_record
{
44 struct session_record
*next
;
47 extern int DEBUGLEVEL
;
49 extern pstring myhostname
;
51 static pstring Ucrit_username
= ""; /* added by OH */
52 int Ucrit_pid
[100]; /* Ugly !!! */ /* added by OH */
53 int Ucrit_MaxPid
=0; /* added by OH */
54 unsigned int Ucrit_IsActive
= 0; /* added by OH */
56 int main(int argc
, char *argv
[])
61 static pstring servicesf
= CONFIGFILE
;
63 int verbose
= 0, brief
=0;
65 BOOL processes_only
=False
;
68 pstring shmem_file_name
;
69 share_mode_record
*scanner_p
;
70 share_mode_record
*prev_p
;
71 int bytes_free
, bytes_used
, bytes_overhead
, bytes_total
;
77 struct session_record
*ptr
;
81 setup_logging(argv
[0],True
);
86 dbf
= fopen("/dev/null","w");
88 if (getuid() != geteuid()) {
89 printf("smbstatus should not be run setuid\n");
93 while ((c
= getopt(argc
, argv
, "pds:u:b")) != EOF
) {
105 strcpy(servicesf
, optarg
);
107 case 'u': /* added by OH */
108 Ucrit_addUsername(optarg
); /* added by OH */
111 fprintf(stderr
, "Usage: %s [-d] [-p] [-s configfile] [-u username]\n", *argv
); /* changed by OH */
116 if (!lp_load(servicesf
,False
)) {
117 fprintf(stderr
, "Can't load %s - run testparm to debug it\n", servicesf
);
121 get_myname(myhostname
, NULL
);
124 printf("using configfile = %s\n", servicesf
);
125 printf("lockdir = %s\n", *lp_lockdir() ? lp_lockdir() : "NULL");
128 strcpy(fname
,lp_lockdir());
129 standard_sub_basic(fname
);
130 trim_string(fname
,"","/");
131 strcat(fname
,"/STATUS..LCK");
133 f
= fopen(fname
,"r");
135 printf("Couldn't open status file %s\n",fname
);
137 printf("You need to have status=yes in your smb config file\n");
141 printf("Opened status file %s\n", fname
);
146 if (!processes_only
) {
147 printf("\nSamba version %s\n",VERSION
);
151 printf("PID Username Machine Time logged in\n");
152 printf("-------------------------------------------------------------------\n");
156 printf("Service uid gid pid machine\n");
157 printf("----------------------------------------------\n");
163 if (fread(&crec
,sizeof(crec
),1,f
) != 1)
165 if ( crec
.magic
== 0x280267 && process_exists(crec
.pid
)
166 && Ucrit_checkUsername(uidtoname(crec
.uid
)) /* added by OH */
174 if ((ptr
->pid
==crec
.pid
)&&(strncmp(ptr
->machine
,crec
.machine
,30)==0))
176 if (ptr
->start
> crec
.start
)
177 ptr
->start
=crec
.start
;
184 ptr
=(struct session_record
*) malloc(sizeof(struct session_record
));
187 ptr
->start
=crec
.start
;
188 strncpy(ptr
->machine
,crec
.machine
,30);
189 ptr
->machine
[30]='\0';
196 Ucrit_addPid(crec
.pid
); /* added by OH */
197 if (processes_only
) {
198 if (last_pid
!= crec
.pid
)
199 printf("%d\n",crec
.pid
);
200 last_pid
= crec
.pid
; /* XXXX we can still get repeats, have to
201 add a sort at some time */
204 printf("%-10.10s %-8s %-8s %5d %-8s (%s) %s",
205 crec
.name
,uidtoname(crec
.uid
),gidtoname(crec
.gid
),crec
.pid
,
206 crec
.machine
,crec
.addr
,
207 asctime(LocalTime(&crec
.start
)));
213 if (processes_only
) exit(0);
220 printf("%-8d%-10.10s%-30.30s%s",ptr
->pid
,uidtoname(ptr
->uid
),ptr
->machine
,asctime(LocalTime(&(ptr
->start
))));
230 /*******************************************************************
231 initialize the shared memory for share_mode management
232 ******************************************************************/
235 strcpy(shmem_file_name
,lp_lockdir());
236 trim_string(shmem_file_name
,"","/");
237 if (!*shmem_file_name
) exit(-1);
238 strcat(shmem_file_name
, "/SHARE_MEM_FILE");
239 if(!smb_shm_open(shmem_file_name
, SHMEM_SIZE
)) exit(-1);
247 scanner_p
= (share_mode_record
*)smb_shm_offset2addr(smb_shm_get_userdef_off());
254 pid
= scanner_p
->pid
;
256 if ( !Ucrit_checkPid(pid
) )
259 scanner_p
= (share_mode_record
*)smb_shm_offset2addr(scanner_p
->next_offset
);
263 if( (scanner_p
->locking_version
!= LOCKING_VERSION
) || !process_exists(pid
))
265 DEBUG(2,("Deleting stale share mode record"));
266 if(prev_p
== scanner_p
)
268 smb_shm_set_userdef_off(scanner_p
->next_offset
);
269 smb_shm_free(smb_shm_addr2offset(scanner_p
));
270 scanner_p
= (share_mode_record
*)smb_shm_offset2addr(smb_shm_get_userdef_off());
275 prev_p
->next_offset
= scanner_p
->next_offset
;
276 smb_shm_free(smb_shm_addr2offset(scanner_p
));
277 scanner_p
= (share_mode_record
*)smb_shm_offset2addr(prev_p
->next_offset
);
281 t
.tv_sec
= scanner_p
->time
.tv_sec
;
282 t
.tv_usec
= scanner_p
->time
.tv_usec
;
283 mode
= scanner_p
->share_mode
;
284 strcpy(fname
, scanner_p
->file_name
);
286 dir
= opendir(lp_lockdir());
288 while ((s
=readdirname(dir
))) {
296 if (sscanf(s
,"share.%d.%d",&dev
,&inode
)!=2) continue;
298 strcpy(lname
,lp_lockdir());
299 trim_string(lname
,NULL
,"/");
303 fd
= open(lname
,O_RDONLY
,0);
304 if (fd
< 0) continue;
305 if (read(fd
,buf
,20) != 20) continue;
306 n
= read(fd
,fname
,sizeof(fname
));
310 t
.tv_sec
= IVAL(buf
,4);
311 t
.tv_usec
= IVAL(buf
,8);
315 if ( !Ucrit_checkPid(pid
) ) /* added by OH */
318 if (IVAL(buf
,0) != LOCKING_VERSION
|| !process_exists(pid
)) {
319 if (unlink(lname
)==0)
320 printf("Deleted stale share file %s\n",s
);
325 fname
[sizeof(fname
)-1] = 0;
329 printf("Locked files:\n");
330 printf("Pid DenyMode R/W Name\n");
331 printf("------------------------------\n");
336 switch ((mode
>>4)&0xF)
338 case DENY_NONE
: printf("DENY_NONE "); break;
339 case DENY_ALL
: printf("DENY_ALL "); break;
340 case DENY_DOS
: printf("DENY_DOS "); break;
341 case DENY_READ
: printf("DENY_READ "); break;
342 case DENY_WRITE
:printf("DENY_WRITE "); break;
346 case 0: printf("RDONLY "); break;
347 case 1: printf("WRONLY "); break;
348 case 2: printf("RDWR "); break;
350 printf(" %s %s",fname
,asctime(LocalTime((time_t *)&t
.tv_sec
)));
354 scanner_p
= (share_mode_record
*)smb_shm_offset2addr(scanner_p
->next_offset
);
357 smb_shm_get_usage(&bytes_free
, &bytes_used
, &bytes_overhead
);
358 bytes_total
= bytes_free
+ bytes_used
+ bytes_overhead
;
361 /*******************************************************************
362 deinitialize the shared memory for share_mode management
363 ******************************************************************/
372 printf("No locked files\n");
374 printf("\nShare mode memory usage (bytes):\n");
375 printf(" %d(%d%%) free + %d(%d%%) used + %d(%d%%) overhead = %d(100%%) total\n",
376 bytes_free
, (bytes_free
* 100)/bytes_total
,
377 bytes_used
, (bytes_used
* 100)/bytes_total
,
378 bytes_overhead
, (bytes_overhead
* 100)/bytes_total
,
387 void Ucrit_addUsername(pstring username
)
389 strcpy(Ucrit_username
, username
);
390 if(strlen(Ucrit_username
) > 0)
394 unsigned int Ucrit_checkUsername(pstring username
)
396 if ( !Ucrit_IsActive
) return 1;
397 if (strcmp(Ucrit_username
,username
) ==0) return 1;
401 void Ucrit_addPid(int pid
)
404 if ( !Ucrit_IsActive
) return;
405 for (i
=0;i
<Ucrit_MaxPid
;i
++)
406 if( pid
== Ucrit_pid
[i
] ) return;
407 Ucrit_pid
[Ucrit_MaxPid
++] = pid
;
410 unsigned int Ucrit_checkPid(int pid
)
413 if ( !Ucrit_IsActive
) return 1;
414 for (i
=0;i
<Ucrit_MaxPid
;i
++)
415 if( pid
== Ucrit_pid
[i
] ) return 1;