/* Unix SMB/Netbios implementation. Version 1.9. status reporting Copyright (C) Andrew Tridgell 1994-1995 This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * This program reports current SMB connections */ #ifdef SYSLOG #undef SYSLOG #endif #include "includes.h" #include "loadparm.h" struct connect_record crec; extern int DEBUGLEVEL; extern FILE *dbf; extern pstring myhostname; static pstring Ucrit_username = ""; /* added by OH */ int Ucrit_pid[100]; /* Ugly !!! */ /* added by OH */ int Ucrit_MaxPid=0; /* added by OH */ unsigned int Ucrit_IsActive = 0; /* added by OH */ void Ucrit_addUsername(pstring username); /* added by OH */ unsigned int Ucrit_checkUsername(pstring username); /* added by OH */ void Ucrit_addPid(int pid); /* added by OH */ unsigned int Ucrit_checkPid(int pid); /* added by OH */ int main(int argc, char *argv[]) { FILE *f; pstring fname; int uid, c, n; static pstring servicesf = CONFIGFILE; extern char *optarg; int verbose = 0; void *dir; char *s; BOOL firstopen=True; BOOL processes_only=False; int last_pid=0; setup_logging(argv[0],True); charset_initialise(); DEBUGLEVEL = 0; dbf = fopen("/dev/null","w"); if (getuid() != geteuid()) { printf("smbstatus should not be run setuid\n"); return(1); } while ((c = getopt(argc, argv, "pds:u:")) != EOF) { switch (c) { case 'd': verbose = 1; break; case 'p': processes_only = 1; break; case 's': strcpy(servicesf, optarg); break; case 'u': /* added by OH */ Ucrit_addUsername(optarg); /* added by OH */ break; default: fprintf(stderr, "Usage: %s [-d] [-p] [-s configfile] [-u username]\n", *argv); /* changed by OH */ return (-1); } } if (!lp_load(servicesf,False)) { fprintf(stderr, "Can't load %s - run testparm to debug it\n", servicesf); return (-1); } get_myname(myhostname, NULL); if (verbose) { printf("using configfile = %s\n", servicesf); printf("lockdir = %s\n", *lp_lockdir() ? lp_lockdir() : "NULL"); } strcpy(fname,lp_lockdir()); standard_sub_basic(fname); trim_string(fname,"","/"); strcat(fname,"/STATUS..LCK"); f = fopen(fname,"r"); if (!f) { printf("Couldn't open status file %s\n",fname); if (!lp_status(-1)) printf("You need to have status=yes in your smb config file\n"); return(0); } else if (verbose) { printf("Opened status file %s\n", fname); } uid = getuid(); if (!processes_only) { printf("\nSamba version %s\n",VERSION); printf("Service uid gid pid machine\n"); printf("----------------------------------------------\n"); } while (!feof(f)) { if (fread(&crec,sizeof(crec),1,f) != 1) break; if ( crec.magic == 0x280267 && process_exists(crec.pid) && Ucrit_checkUsername(uidtoname(crec.uid)) /* added by OH */ ) { Ucrit_addPid(crec.pid); /* added by OH */ if (processes_only) { if (last_pid != crec.pid) printf("%d\n",crec.pid); last_pid = crec.pid; /* XXXX we can still get repeats, have to add a sort at some time */ } else printf("%-10.10s %-8s %-8s %5d %-8s (%s) %s", crec.name,uidtoname(crec.uid),gidtoname(crec.gid),crec.pid, crec.machine,crec.addr, asctime(LocalTime(&crec.start,GMT_TO_LOCAL))); } } fclose(f); if (processes_only) exit(0); printf("\n"); dir = opendir(lp_lockdir()); if (!dir) return(0); while ((s=readdirname(dir))) { char buf[16]; int pid,mode; time_t t; int fd; pstring lname; int dev,inode; if (sscanf(s,"share.%d.%d",&dev,&inode)!=2) continue; strcpy(lname,lp_lockdir()); trim_string(lname,NULL,"/"); strcat(lname,"/"); strcat(lname,s); fd = open(lname,O_RDONLY,0); if (fd < 0) continue; if (read(fd,buf,16) != 16) continue; n = read(fd,fname,sizeof(fname)); fname[MAX(n,0)]=0; close(fd); t = IVAL(buf,0); mode = IVAL(buf,4); pid = IVAL(buf,8); if ( !Ucrit_checkPid(pid) ) /* added by OH */ continue; if (IVAL(buf,12) != LOCKING_VERSION || !process_exists(pid)) { if (unlink(lname)==0) printf("Deleted stale share file %s\n",s); continue; } fname[sizeof(fname)-1] = 0; if (firstopen) { firstopen=False; printf("Locked files:\n"); printf("Pid DenyMode R/W Name\n"); printf("------------------------------\n"); } printf("%-5d ",pid); switch ((mode>>4)&0xF) { case DENY_NONE: printf("DENY_NONE "); break; case DENY_ALL: printf("DENY_ALL "); break; case DENY_DOS: printf("DENY_DOS "); break; case DENY_READ: printf("DENY_READ "); break; case DENY_WRITE:printf("DENY_WRITE "); break; } switch (mode&0xF) { case 0: printf("RDONLY "); break; case 1: printf("WRONLY "); break; case 2: printf("RDWR "); break; } printf(" %s %s",fname,asctime(LocalTime(&t,GMT_TO_LOCAL))); } closedir(dir); if (firstopen) printf("No locked files\n"); return (0); } /* added by OH */ void Ucrit_addUsername(pstring username) { strcpy(Ucrit_username, username); if(strlen(Ucrit_username) > 0) Ucrit_IsActive = 1; } unsigned int Ucrit_checkUsername(pstring username) { if ( !Ucrit_IsActive) return 1; if (strcmp(Ucrit_username,username) ==0) return 1; return 0; } void Ucrit_addPid(int pid) { int i; if ( !Ucrit_IsActive) return; for (i=0;i