Patches to add information and improve readability for smbstatus/swat
Chris Maltby
chris at sw.oz.au
Fri Nov 26 04:02:30 GMT 1999
The following is a Samba2.0.6 update of a patch I first did for Samba1.
It adds a reference to the connection number (cnum) into the oplock
record so that the session responsible for the lock can also be identified.
This means that smbstatus -u will only print oplocks associated with the
user specified.
I have also tidied up the print format for the smbstatus and swat reports
to make it more concise and useful - the oplock time is reported as a
difference between the time the lock was acquired and the current time.
The patch also speeds up swat by cacheing the session records instead
of re-reading them from the file about 4 times - it may make sense to
sort the list according to some argument - by user, share, time etc.
What should probably be done is to add the equivalent of smbstatus -u to
the swat status page to allow info on a single or set of selected users.
I haven't spent enough time working out how the http stuff works to build
the web glue for that. The reporting stuff would be easy..
Hope this finds favour,
Regards
Chris
*** source/web/statuspage.c.orig Wed Oct 13 15:27:03 1999
--- source/web/statuspage.c Mon Nov 15 16:38:16 1999
***************
*** 21,38 ****
#include "includes.h"
! static char *tstring(time_t t)
{
static pstring buf;
! pstrcpy(buf, asctime(LocalTime(&t)));
all_string_sub(buf," "," ",sizeof(buf));
return buf;
}
static void print_share_mode(share_mode_entry *e, char *fname)
{
! printf("<tr><td>%d</td>",(int)e->pid);
printf("<td>");
switch ((e->share_mode>>4)&0xF) {
case DENY_NONE: printf("DENY_NONE"); break;
--- 21,76 ----
#include "includes.h"
+ #define talloc(t) ((t *) malloc(sizeof (t)))
! struct session_record
! {
! struct session_record *next;
! struct connect_record crec;
! } *srecs;
!
! struct timeval now;
!
! static char *timediff(time_t t)
{
static pstring buf;
!
! if (t < (60*60))
! snprintf(buf, sizeof(buf), "%2ldm%02lds", t/60, t%60);
! else if ((t = (t+30)/60) < (24*60))
! snprintf(buf, sizeof(buf), "%2ldh%02ldm", t/60, t%60);
! else if ((t = (t+30)/60) < (7*24))
! snprintf(buf, sizeof(buf), "%2ldd%02ldh", t/24, t%24);
! else
! snprintf(buf, sizeof(buf), "%2ldw%02ldd", t/(7*24), (t/24)%7);
! all_string_sub(buf," "," ",sizeof(buf));
! return buf;
! }
!
! static char *tstring(time_t *t)
! {
! static pstring buf;
! struct tm *tm = LocalTime(t);
!
! #ifdef HAVE_STRFTIME
! strftime(buf, sizeof(buf), "%Y/%m/%d %H:%M:%S%n", tm);
! #else
! pstrcpy(buf, asctime(tm));
! #endif
all_string_sub(buf," "," ",sizeof(buf));
return buf;
}
static void print_share_mode(share_mode_entry *e, char *fname)
{
! struct session_record *p;
!
! for (p = srecs; p != NULL; p = p->next) {
! if (p->crec.pid == e->pid && p->crec.cnum == e->cnum)
! break;
! }
! printf("<tr><td>%s</td>", p != NULL ? uidtoname(p->crec.uid) : "");
! printf("<td>%d</td>",(int)e->pid);
printf("<td>");
switch ((e->share_mode>>4)&0xF) {
case DENY_NONE: printf("DENY_NONE"); break;
***************
*** 45,53 ****
printf("<td>");
switch (e->share_mode&0xF) {
! case 0: printf("RDONLY "); break;
! case 1: printf("WRONLY "); break;
! case 2: printf("RDWR "); break;
}
printf("</td>");
--- 83,91 ----
printf("<td>");
switch (e->share_mode&0xF) {
! case 0: printf("R/-"); break;
! case 1: printf("-/W"); break;
! case 2: printf("R/W"); break;
}
printf("</td>");
***************
*** 55,80 ****
if((e->op_type &
(EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) ==
(EXCLUSIVE_OPLOCK|BATCH_OPLOCK))
! printf("EXCLUSIVE+BATCH ");
else if (e->op_type & EXCLUSIVE_OPLOCK)
! printf("EXCLUSIVE ");
else if (e->op_type & BATCH_OPLOCK)
! printf("BATCH ");
else if (e->op_type & LEVEL_II_OPLOCK)
! printf("LEVEL_II ");
else
! printf("NONE ");
printf("</td>");
printf("<td>%s</td><td>%s</td></tr>\n",
! dos_to_unix(fname,False),tstring(e->time.tv_sec));
}
/* show the current server status */
void status_page(void)
{
! struct connect_record crec;
pstring fname;
FILE *f;
char *v;
--- 93,119 ----
if((e->op_type &
(EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) ==
(EXCLUSIVE_OPLOCK|BATCH_OPLOCK))
! printf("EXCL+BATCH");
else if (e->op_type & EXCLUSIVE_OPLOCK)
! printf("EXCL");
else if (e->op_type & BATCH_OPLOCK)
! printf("BATCH");
else if (e->op_type & LEVEL_II_OPLOCK)
! printf("LEVEL_II");
else
! printf("NONE");
printf("</td>");
+ printf("<td>%s</td>", p != NULL ? p->crec.name : "");
printf("<td>%s</td><td>%s</td></tr>\n",
! dos_to_unix(fname,False),timediff(now.tv_sec - e->time.tv_sec));
}
/* show the current server status */
void status_page(void)
{
! struct session_record *p;
pstring fname;
FILE *f;
char *v;
***************
*** 126,145 ****
pstrcat(fname,"/STATUS..LCK");
! f = sys_fopen(fname,"r");
! if (f) {
! while (!feof(f)) {
! if (fread(&crec,sizeof(crec),1,f) != 1) break;
! if (crec.magic == 0x280267 && crec.cnum == -1 &&
! process_exists(crec.pid)) {
! char buf[30];
! slprintf(buf,sizeof(buf)-1,"kill_%d", (int)crec.pid);
! if (cgi_variable(buf)) {
! kill_pid(crec.pid);
! }
! }
}
! fclose(f);
}
printf("<H2>Server Status</H2>\n");
--- 165,202 ----
pstrcat(fname,"/STATUS..LCK");
! if ((f = sys_fopen(fname,"r")) != NULL) {
! struct session_record **op = &srecs;
!
! p = NULL;
! while (!feof(f)) {
! if (p == NULL && (p = talloc(struct session_record)) == NULL)
! break;
! if (fread(&p->crec,sizeof(p->crec),1,f) != 1)
! break;
! if (p->crec.magic != 0x280267 || !process_exists(p->crec.pid))
! continue;
! *op = p;
! op = &p->next;
! p = NULL;
! }
! *op = NULL;
! fclose(f);
! } else {
! 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");
! }
!
! for (p = srecs; p != NULL; p = p->next) {
! if (p->crec.magic == 0x280267 && p->crec.cnum == -1) {
! char buf[30];
!
! slprintf(buf,sizeof(buf)-1,"kill_%d", (int)(p->crec.pid));
! if (cgi_variable(buf)) {
! kill_pid(p->crec.pid);
}
! }
}
printf("<H2>Server Status</H2>\n");
***************
*** 159,172 ****
printf("<p>\n");
! f = sys_fopen(fname,"r");
! if (!f) {
! /* open failure either means no connections have been
! made or status=no */
! if (!lp_status(-1))
! printf("You need to have status=yes in your smb config file\n");
! }
!
printf("<table>\n");
--- 216,222 ----
printf("<p>\n");
! fflush(stdout);
printf("<table>\n");
***************
*** 207,263 ****
}
printf("</tr>\n");
! while (f && !feof(f)) {
! if (fread(&crec,sizeof(crec),1,f) != 1)
! break;
! if (crec.magic == 0x280267 &&
! crec.cnum == -1 &&
! process_exists(crec.pid)) {
! printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td>\n",
! (int)crec.pid,
! crec.machine,crec.addr,
! tstring(crec.start));
! if (geteuid() == 0) {
! printf("<td><input type=submit value=\"X\" name=\"kill_%d\"></td>\n",
! (int)crec.pid);
! }
! printf("</tr>\n");
}
}
printf("</table><p>\n");
-
- if (f) fseek(f, 0, SEEK_SET);
printf("<p><h3>Active Shares</h3>\n");
printf("<table border=1>\n");
printf("<tr><th>Share</th><th>User</th><th>Group</th><th>PID</th><th>Client</th><th>Date</th></tr>\n\n");
! while (f && !feof(f)) {
! if (fread(&crec,sizeof(crec),1,f) != 1)
! break;
! if (crec.cnum == -1) continue;
! if (crec.magic == 0x280267 && process_exists(crec.pid)) {
! printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td></tr>\n",
! crec.name,uidtoname(crec.uid),
! gidtoname(crec.gid),(int)crec.pid,
! crec.machine,
! tstring(crec.start));
! }
}
printf("</table><p>\n");
printf("<h3>Open Files</h3>\n");
printf("<table border=1>\n");
! printf("<tr><th>PID</th><th>Sharing</th><th>R/W</th><th>Oplock</th><th>File</th><th>Date</th></tr>\n");
locking_init(1);
share_mode_forall(print_share_mode);
locking_end();
printf("</table>\n");
!
! if (f) fclose(f);
printf("</FORM>\n");
--- 257,308 ----
}
printf("</tr>\n");
! for (p = srecs; p != NULL; p = p->next) {
! if (p->crec.magic == 0x280267 && p->crec.cnum == -1) {
! printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td>\n",
! (int)p->crec.pid,
! p->crec.machine,p->crec.addr,
! tstring(&p->crec.start));
! if (geteuid() == 0) {
! printf("<td><input type=submit value=\"X\" name=\"kill_%d\"></td>\n",
! (int)p->crec.pid);
}
+ printf("</tr>\n");
+ }
}
printf("</table><p>\n");
printf("<p><h3>Active Shares</h3>\n");
printf("<table border=1>\n");
printf("<tr><th>Share</th><th>User</th><th>Group</th><th>PID</th><th>Client</th><th>Date</th></tr>\n\n");
! for (p = srecs; p != NULL; p = p->next) {
! if (p->crec.magic != 0x280267 || p->crec.cnum == -1) continue;
! printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td></tr>\n",
! p->crec.name,uidtoname(p->crec.uid),
! gidtoname(p->crec.gid),(int)p->crec.pid,
! p->crec.machine,
! tstring(&p->crec.start));
}
printf("</table><p>\n");
+ #ifdef HAVE_GETTIMEOFDAY_TZ
+ gettimeofday(&now,NULL);
+ #else
+ gettimeofday(&now);
+ #endif
+
printf("<h3>Open Files</h3>\n");
printf("<table border=1>\n");
! printf("<tr><th>User</th><th>PID</th><th>Sharing</th><th>R/W</th><th>Oplock</th><th>Share</th><th>File</th><th>Held</th></tr>\n");
locking_init(1);
share_mode_forall(print_share_mode);
locking_end();
printf("</table>\n");
! fflush(stdout);
printf("</FORM>\n");
*** source/locking/locking_shm.c.orig Wed Jul 21 11:25:10 1999
--- source/locking/locking_shm.c Fri Nov 12 18:12:39 1999
***************
*** 220,225 ****
--- 220,226 ----
created it still exists. Copy it into the output array.
*/
share_array[num_entries_copied].pid = entry_scanner_p->e.pid;
+ share_array[num_entries_copied].cnum = entry_scanner_p->e.cnum;
share_array[num_entries_copied].share_mode = entry_scanner_p->e.share_mode;
share_array[num_entries_copied].op_port = entry_scanner_p->e.op_port;
share_array[num_entries_copied].op_type = entry_scanner_p->e.op_type;
***************
*** 471,476 ****
--- 472,478 ----
new_entry_p = shmops->offset2addr(new_entry_offset);
new_entry_p->e.pid = getpid();
+ new_entry_p->e.cnum = fsp->conn->cnum;
new_entry_p->e.share_mode = fsp->share_mode;
new_entry_p->e.op_port = port;
new_entry_p->e.op_type = op_type;
*** source/locking/locking_slow.c.orig Wed Oct 13 15:26:51 1999
--- source/locking/locking_slow.c Fri Nov 12 18:12:39 1999
***************
*** 46,52 ****
#define SMF_FILENAME_LEN_OFFSET 8
#define SMF_HEADER_LENGTH 10
! #define SMF_ENTRY_LENGTH 20
/*
* Share mode record offsets.
--- 46,52 ----
#define SMF_FILENAME_LEN_OFFSET 8
#define SMF_HEADER_LENGTH 10
! #define SMF_ENTRY_LENGTH 24
/*
* Share mode record offsets.
***************
*** 58,63 ****
--- 58,64 ----
#define SME_PID_OFFSET 12
#define SME_PORT_OFFSET 16
#define SME_OPLOCK_TYPE_OFFSET 18
+ #define SME_CNUM_OFFSET 20
/* we need world read for smbstatus to function correctly */
#ifdef SECURE_SHARE_MODES
***************
*** 381,386 ****
--- 382,389 ----
8 - share_mode
12 - pid
16 - oplock port (if oplocks in use) - 2 bytes.
+ 18 - oplock type (if oplocks in use) - 2 bytes.
+ 20 - cnum - 4 bytes
*/
share_name(conn, dev, inode, fname);
***************
*** 452,457 ****
--- 455,461 ----
share_array[num_entries_copied].pid = pid;
share_array[num_entries_copied].op_port = SVAL(p,SME_PORT_OFFSET);
share_array[num_entries_copied].op_type = SVAL(p,SME_OPLOCK_TYPE_OFFSET);
+ share_array[num_entries_copied].cnum = IVAL(p,SME_CNUM_OFFSET);
num_entries_copied++;
}
***************
*** 498,503 ****
--- 502,508 ----
SIVAL(p,SME_USEC_OFFSET,share_array[i].time.tv_usec);
SSVAL(p,SME_PORT_OFFSET,share_array[i].op_port);
SSVAL(p,SME_OPLOCK_TYPE_OFFSET,share_array[i].op_type);
+ SIVAL(p,SME_CNUM_OFFSET,share_array[i].cnum);
}
newsize = (base - buf) + (SMF_ENTRY_LENGTH*num_entries_copied);
***************
*** 811,816 ****
--- 816,822 ----
SIVAL(p,SME_PID_OFFSET,(uint32)pid);
SSVAL(p,SME_PORT_OFFSET,port);
SSVAL(p,SME_OPLOCK_TYPE_OFFSET,op_type);
+ SIVAL(p,SME_CNUM_OFFSET,fsp->conn->cnum);
num_entries++;
***************
*** 1083,1088 ****
--- 1089,1095 ----
e.time.tv_usec = IVAL(p,SME_USEC_OFFSET);
e.op_port = SVAL(p,SME_PORT_OFFSET);
e.op_type = SVAL(p,SME_OPLOCK_TYPE_OFFSET);
+ e.cnum = IVAL(p,SME_CNUM_OFFSET);
if (process_exists(e.pid)) {
fn(&e, fname);
*** source/include/smb.h.orig Thu Nov 11 13:36:01 1999
--- source/include/smb.h Fri Nov 12 18:16:03 1999
***************
*** 724,729 ****
--- 724,730 ----
typedef struct
{
pid_t pid;
+ int cnum; /* for status display */
uint16 op_port;
uint16 op_type;
int share_mode;
***************
*** 886,892 ****
#define FLAG_DOS_STRING 0x40 /* convert from UNIX to DOS codepage when reading this string. */
#ifndef LOCKING_VERSION
! #define LOCKING_VERSION 4
#endif /* LOCKING_VERSION */
/* these are useful macros for checking validity of handles */
--- 887,893 ----
#define FLAG_DOS_STRING 0x40 /* convert from UNIX to DOS codepage when reading this string. */
#ifndef LOCKING_VERSION
! #define LOCKING_VERSION 5
#endif /* LOCKING_VERSION */
/* these are useful macros for checking validity of handles */
*** source/utils/status.c.orig Wed Oct 13 15:27:03 1999
--- source/utils/status.c Fri Nov 12 18:30:05 1999
***************
*** 41,47 ****
struct session_record{
pid_t pid;
uid_t uid;
! char machine[31];
time_t start;
struct session_record *next;
} *srecs;
--- 41,49 ----
struct session_record{
pid_t pid;
uid_t uid;
! int cnum;
! char machine[32];
! char service[24];
time_t start;
struct session_record *next;
} *srecs;
***************
*** 57,66 ****
--- 59,104 ----
int shares_only = 0; /* Added by RJS */
int locks_only = 0; /* Added by RJS */
+ #define talloc(t) ((t *) malloc(sizeof (t)))
+
/* we need these because we link to locking*.o */
void become_root(BOOL save_dir) {}
void unbecome_root(BOOL restore_dir) {}
+ struct timeval now;
+
+ /****************************************************************************
+ the date and time as a string
+ ****************************************************************************/
+ static char *fmttime(time_t *t)
+ {
+ static char TimeBuf[100];
+ struct tm *tm = LocalTime(t);
+
+ #ifdef HAVE_STRFTIME
+ strftime(TimeBuf, sizeof(TimeBuf), "%Y/%m/%d %H:%M:%S%n", tm);
+ #else
+ safe_strcpy(TimeBuf, asctime(tm), sizeof(TimeBuf) - 1);
+ #endif
+
+ return TimeBuf;
+ }
+
+ static char *prtimediff(time_t t)
+ {
+ static char TimeBuf[100];
+
+ if (t < (60*60))
+ snprintf(TimeBuf, sizeof(TimeBuf), "%2ldm%02lds", t/60, t%60);
+ else if ((t = (t+30)/60) < (24*60))
+ snprintf(TimeBuf, sizeof(TimeBuf), "%2ldh%02ldm", t/60, t%60);
+ else if ((t = (t+30)/60) < (7*24))
+ snprintf(TimeBuf, sizeof(TimeBuf), "%2ldd%02ldh", t/24, t%24);
+ else
+ snprintf(TimeBuf, sizeof(TimeBuf), "%2ldw%02ldd", t/(7*24), (t/24)%7);
+ return TimeBuf;
+ }
+
/* added by OH */
static void Ucrit_addUsername(char *username)
***************
*** 77,142 ****
return 0;
}
- static void Ucrit_addPid(pid_t pid)
- {
- int i;
- if ( !Ucrit_IsActive) return;
- for (i=0;i<Ucrit_MaxPid;i++)
- if( pid == Ucrit_pid[i] ) return;
- Ucrit_pid[Ucrit_MaxPid++] = pid;
- }
-
- static unsigned int Ucrit_checkPid(pid_t pid)
- {
- int i;
- if ( !Ucrit_IsActive) return 1;
- for (i=0;i<Ucrit_MaxPid;i++)
- if( pid == Ucrit_pid[i] ) return 1;
- return 0;
- }
-
-
static void print_share_mode(share_mode_entry *e, char *fname)
{
static int count;
! if (count==0) {
! printf("Locked files:\n");
! printf("Pid DenyMode R/W Oplock Name\n");
! printf("--------------------------------------------------\n");
}
! count++;
! if (Ucrit_checkPid(e->pid)) {
! printf("%-5d ",(int)e->pid);
! switch ((e->share_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 (e->share_mode&0xF) {
! case 0: printf("RDONLY "); break;
! case 1: printf("WRONLY "); break;
! case 2: printf("RDWR "); break;
}
! if((e->op_type &
! (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) ==
! (EXCLUSIVE_OPLOCK|BATCH_OPLOCK))
! printf("EXCLUSIVE+BATCH ");
! else if (e->op_type & EXCLUSIVE_OPLOCK)
! printf("EXCLUSIVE ");
! else if (e->op_type & BATCH_OPLOCK)
! printf("BATCH ");
! else if (e->op_type & LEVEL_II_OPLOCK)
! printf("LEVEL_II ");
! else
! printf("NONE ");
!
! printf(" %s %s",dos_to_unix(fname,False),
! asctime(LocalTime((time_t *)&e->time.tv_sec)));
}
}
--- 115,192 ----
return 0;
}
static void print_share_mode(share_mode_entry *e, char *fname)
{
static int count;
! struct session_record *ptr;
! char *user;
! char *share;
!
! user = "";
! share = NULL;
! for (ptr=srecs; ptr!=NULL; ptr=ptr->next) {
! if (ptr->pid == e->pid && ptr->cnum == e->cnum) {
! user = uidtoname(ptr->uid);
! share = ptr->service;
! break;
! }
}
! if (!Ucrit_checkUsername(user)) /* added by OH */
! return;
! if (count==0) {
! if (locks_only) {
! printf(" Pid Deny R/W Oplock Held Name\n");
! printf("---------------------------------------\n");
}
! else {
! printf("Locked files:\n");
! if (Ucrit_IsActive)
! printf(" Pid Deny R/W Oplock Held Share Name\n");
! else
! printf("User Deny R/W Oplock Held Share Name\n");
! printf( "------------------------------------------------\n");
}
+ }
+ count++;
! if (Ucrit_IsActive||locks_only)
! printf("%6d ",e->pid);
! else if (share != NULL)
! printf("%-8.8s ",user);
! else
! printf("[%6d] ",e->pid);
! switch ((e->share_mode>>4)&0xF) {
! case DENY_NONE: printf("NONE "); break;
! case DENY_ALL: printf("ALL "); break;
! case DENY_DOS: printf("DOS "); break;
! case DENY_READ: printf("READ "); break;
! case DENY_WRITE:printf("WRIT "); break;
}
+ switch (e->share_mode&0xF) {
+ case 0: printf("R/- "); break;
+ case 1: printf("-/W "); break;
+ case 2: printf("R/W "); break;
+ }
+
+ if((e->op_type &
+ (EXCLUSIVE_OPLOCK|BATCH_OPLOCK)) ==
+ (EXCLUSIVE_OPLOCK|BATCH_OPLOCK))
+ printf("EXCL+BTCH ");
+ else if (e->op_type & EXCLUSIVE_OPLOCK)
+ printf("EXCLUSIVE ");
+ else if (e->op_type & BATCH_OPLOCK)
+ printf("BATCH ");
+ else if (e->op_type & LEVEL_II_OPLOCK)
+ printf("LEVEL_II ");
+ else
+ printf("NONE ");
+
+ printf("%s ",prtimediff(now.tv_sec - e->time.tv_sec));
+ if (share!=NULL&&!locks_only)
+ printf("%7.23s ",share);
+ printf("%s\n",dos_to_unix(fname,False));
+
}
***************
*** 155,160 ****
--- 205,211 ----
TimeInit();
+ GetTimeOfDay(&now);
setup_logging(argv[0],True);
charset_initialise();
***************
*** 191,197 ****
Ucrit_addUsername(optarg); /* added by OH */
break;
default:
! fprintf(stderr, "Usage: %s [-d] [-L] [-p] [-S] [-s configfile] [-u username]\n", *argv); /* changed by OH */
return (-1);
}
}
--- 242,248 ----
Ucrit_addUsername(optarg); /* added by OH */
break;
default:
! fprintf(stderr, "Usage: %s [-b] [-d] [-L] [-p] [-S] [-s configfile] [-u username]\n", *argv); /* changed by OH */
return (-1);
}
}
***************
*** 249,255 ****
)
{
if (brief)
! {
ptr=srecs;
while (ptr!=NULL)
{
--- 300,306 ----
)
{
if (brief)
! { /* brief, only need to keep details of first connect */
ptr=srecs;
while (ptr!=NULL)
{
***************
*** 261,292 ****
}
ptr=ptr->next;
}
- if (ptr==NULL)
- {
- ptr=(struct session_record *) malloc(sizeof(struct session_record));
- ptr->uid=crec.uid;
- ptr->pid=crec.pid;
- ptr->start=crec.start;
- strncpy(ptr->machine,crec.machine,30);
- ptr->machine[30]='\0';
- ptr->next=srecs;
- srecs=ptr;
- }
}
! else
{
- Ucrit_addPid(crec.pid); /* added by OH */
if (processes_only) {
if (last_pid != crec.pid)
printf("%d\n",(int)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),(int)crec.pid,
! crec.machine,crec.addr,
asctime(LocalTime(&crec.start)));
}
}
}
--- 312,348 ----
}
ptr=ptr->next;
}
}
! if ((!brief||ptr==NULL)&&(ptr=talloc(struct session_record))!=NULL)
! {
! ptr->uid=crec.uid;
! ptr->pid=crec.pid;
! ptr->cnum=crec.cnum;
! ptr->start=crec.start;
! strncpy(ptr->machine,crec.machine,31);
! ptr->machine[31]='\0';
! strncpy(ptr->service,crec.name,23);
! ptr->machine[23]='\0';
! ptr->next=srecs;
! srecs=ptr;
! }
! if (!brief)
{
if (processes_only) {
if (last_pid != crec.pid)
printf("%d\n",(int)crec.pid);
last_pid = crec.pid; /* XXXX we can still get repeats, have to
add a sort at some time */
}
! else if (verbose)
printf("%-10.10s %-8s %-8s %5d %-8s (%s) %s",
! crec.name,uidtoname(crec.uid),gidtoname(crec.gid),
! (int)crec.pid,crec.machine,crec.addr,
asctime(LocalTime(&crec.start)));
+ else
+ printf("%-10.10s %-8s %-8s %5d %-8s %s",
+ crec.name,uidtoname(crec.uid),gidtoname(crec.gid),
+ (int)crec.pid,crec.machine,fmttime(&crec.start));
}
}
}
--
Chris Maltby -Aurema Pty Limited- (formerly Softway) - chris at sw.oz.au
PHONE: +61-2-9698-2322 "In most companies the Managing Director has
FAX: +61-2-9699-9174 his office in the future." _- Mark V. Shaney
More information about the samba-technical
mailing list