summaryrefslogtreecommitdiffstats
path: root/source/utils/status.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/utils/status.c')
-rw-r--r--source/utils/status.c260
1 files changed, 177 insertions, 83 deletions
diff --git a/source/utils/status.c b/source/utils/status.c
index e8e57b3dd7c..b439741e6c6 100644
--- a/source/utils/status.c
+++ b/source/utils/status.c
@@ -53,6 +53,81 @@ int Ucrit_pid[100]; /* Ugly !!! */ /* added by OH */
int Ucrit_MaxPid=0; /* added by OH */
unsigned int Ucrit_IsActive = 0; /* added by OH */
+#ifndef FAST_SHARE_MODES
+static char *read_share_file(int fd, char *fname, char *progname)
+{
+ struct stat sb;
+ char *buf;
+ int size;
+
+ if(fstat(fd, &sb) != 0)
+ {
+ printf("%s: ERROR: read_share_file: Failed to do stat on share file %s (%s)\n",
+ progname, fname, strerror(errno));
+ return 0;
+ }
+
+ if(sb.st_size == 0)
+ {
+ return 0;
+ }
+
+ /* Allocate space for the file */
+ if((buf = (char *)malloc(sb.st_size)) == NULL)
+ {
+ printf("%s: read_share_file: malloc for file size %d fail !\n",
+ progname, (int)sb.st_size);
+ return 0;
+ }
+
+ if(lseek(fd, 0, SEEK_SET) != 0)
+ {
+ printf("%s: ERROR: read_share_file: Failed to reset position to 0 \
+for share file %s (%s)\n", progname, fname, strerror(errno));
+ if(buf)
+ free(buf);
+ return 0;
+ }
+
+ if (read(fd,buf,sb.st_size) != sb.st_size)
+ {
+ printf("%s: ERROR: read_share_file: Failed to read share file %s (%s)\n",
+ progname, fname, strerror(errno));
+ if(buf)
+ free(buf);
+ return 0;
+ }
+
+ if (IVAL(buf,0) != LOCKING_VERSION) {
+ printf("%s: ERROR: read_share_file: share file %s has incorrect \
+locking version (was %d, should be %d).\n",fname,
+ progname, IVAL(buf,0), LOCKING_VERSION);
+ if(buf)
+ free(buf);
+ return 0;
+ }
+
+ /* Sanity check for file contents */
+ size = sb.st_size;
+ size -= 10; /* Remove the header */
+
+ /* Remove the filename component. */
+ size -= SVAL(buf, 8);
+
+ /* The remaining size must be a multiple of 16 - error if not. */
+ if((size % 16) != 0)
+ {
+ printf("%s: ERROR: read_share_file: share file %s is an incorrect length.\n",
+ progname, fname);
+ if(buf)
+ free(buf);
+ return 0;
+ }
+
+ return buf;
+}
+#endif /* FAST_SHARE_MODES */
+
int main(int argc, char *argv[])
{
FILE *f;
@@ -64,16 +139,16 @@ unsigned int Ucrit_IsActive = 0; /* added by OH */
BOOL firstopen=True;
BOOL processes_only=False;
int last_pid=0;
-#if FAST_SHARE_MODES
+#ifdef FAST_SHARE_MODES
pstring shmem_file_name;
- share_mode_record *scanner_p;
- share_mode_record *prev_p;
+ share_mode_record *file_scanner_p;
+ smb_shm_offset_t *mode_array;
int bytes_free, bytes_used, bytes_overhead, bytes_total;
-#else
- int n;
+#else /* FAST_SHARE_MODES */
void *dir;
char *s;
-#endif
+#endif /* FAST_SHARE_MODES */
+ int i;
struct session_record *ptr;
@@ -226,101 +301,110 @@ unsigned int Ucrit_IsActive = 0; /* added by OH */
printf("\n");
-#if FAST_SHARE_MODES
+#ifdef FAST_SHARE_MODES
/*******************************************************************
initialize the shared memory for share_mode management
******************************************************************/
-
strcpy(shmem_file_name,lp_lockdir());
trim_string(shmem_file_name,"","/");
if (!*shmem_file_name) exit(-1);
strcat(shmem_file_name, "/SHARE_MEM_FILE");
- if(!smb_shm_open(shmem_file_name, SHMEM_SIZE)) exit(-1);
+ if(!smb_shm_open(shmem_file_name, lp_shmem_size())) exit(-1);
- if(!smb_shm_lock())
+ mode_array = (smb_shm_offset_t *)smb_shm_offset2addr(smb_shm_get_userdef_off());
+ if(mode_array == NULL)
{
- smb_shm_close();
- exit (-1);
+ printf("%s: base of shared memory hash array == 0! Exiting.\n", argv[0]);
+ smb_shm_close();
+ exit(-1);
}
- scanner_p = (share_mode_record *)smb_shm_offset2addr(smb_shm_get_userdef_off());
- prev_p = scanner_p;
- while(scanner_p)
+ for( i = 0; i < lp_shmem_hash_size(); i++)
{
- int pid,mode;
- struct timeval t;
-
- pid = scanner_p->pid;
-
- if ( !Ucrit_checkPid(pid) )
- {
- prev_p = scanner_p ;
- scanner_p = (share_mode_record *)smb_shm_offset2addr(scanner_p->next_offset);
- continue;
- }
+ smb_shm_lock_hash_entry(i);
+ if(mode_array[i] == NULL_OFFSET)
+ {
+ smb_shm_unlock_hash_entry(i);
+ continue;
+ }
+ file_scanner_p = (share_mode_record *)smb_shm_offset2addr(mode_array[i]);
+ while((file_scanner_p != 0) && (file_scanner_p->num_share_mode_entries != 0))
+ {
+ share_mode_entry *entry_scanner_p =
+ (share_mode_entry *)smb_shm_offset2addr(
+ file_scanner_p->share_mode_entries);
+
+ while(entry_scanner_p != 0)
+ {
+ struct timeval t;
+ int pid = entry_scanner_p->pid;
+ int mode = entry_scanner_p->share_mode;
- if( (scanner_p->locking_version != LOCKING_VERSION) || !process_exists(pid))
+ t.tv_sec = entry_scanner_p->time.tv_sec;
+ t.tv_usec = entry_scanner_p->time.tv_usec;
+ strcpy(fname, file_scanner_p->file_name);
+#else /* FAST_SHARE_MODES */
+
+ /* For slow share modes go through all the files in
+ the share mode directory and read the entries in
+ each.
+ */
+
+ dir = opendir(lp_lockdir());
+ if (!dir)
{
- DEBUG(2,("Deleting stale share mode record"));
- if(prev_p == scanner_p)
- {
- smb_shm_set_userdef_off(scanner_p->next_offset);
- smb_shm_free(smb_shm_addr2offset(scanner_p));
- scanner_p = (share_mode_record *)smb_shm_offset2addr(smb_shm_get_userdef_off());
- prev_p = scanner_p;
- }
- else
- {
- prev_p->next_offset = scanner_p->next_offset;
- smb_shm_free(smb_shm_addr2offset(scanner_p));
- scanner_p = (share_mode_record *)smb_shm_offset2addr(prev_p->next_offset);
- }
- continue;
+ printf("%s: Unable to open lock directory %s.\n", argv[0], lp_lockdir());
+ return(0);
}
- t.tv_sec = scanner_p->time.tv_sec;
- t.tv_usec = scanner_p->time.tv_usec;
- mode = scanner_p->share_mode;
- strcpy(fname, scanner_p->file_name);
-#else
- dir = opendir(lp_lockdir());
- if (!dir) return(0);
while ((s=readdirname(dir))) {
- char buf[20];
- int pid,mode;
- struct timeval t;
+ char *buf;
+ char *base;
int fd;
pstring lname;
- int dev,inode;
+ uint32 dev,inode;
- if (sscanf(s,"share.%d.%d",&dev,&inode)!=2) continue;
+ if (sscanf(s,"share.%u.%u",&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,20) != 20) continue;
- n = read(fd,fname,sizeof(fname));
- fname[MAX(n,0)]=0;
- close(fd);
-
- t.tv_sec = IVAL(buf,4);
- t.tv_usec = IVAL(buf,8);
- mode = IVAL(buf,12);
- pid = IVAL(buf,16);
-
- if ( !Ucrit_checkPid(pid) ) /* added by OH */
- continue;
-
- if (IVAL(buf,0) != LOCKING_VERSION || !process_exists(pid)) {
- if (unlink(lname)==0)
- printf("Deleted stale share file %s\n",s);
- continue;
+ fd = open(lname,O_RDWR,0);
+ if (fd < 0)
+ {
+ printf("%s: Unable to open share file %s.\n", argv[0], lname);
+ continue;
}
-#endif
+
+ /* Lock the share mode file while we read it. */
+ if(fcntl_lock(fd, F_SETLKW, 0, 1, F_WRLCK) == False)
+ {
+ printf("%s: Unable to lock open share file %s.\n", argv[0], lname);
+ close(fd);
+ continue;
+ }
+
+ if(( buf = read_share_file( fd, lname, argv[0] )) == NULL)
+ {
+ close(fd);
+ continue;
+ }
+ strcpy( fname, &buf[10]);
+ close(fd);
+
+ base = buf + 10 + SVAL(buf,8);
+ for( i = 0; i < IVAL(buf, 4); i++)
+ {
+ char *p = base + (i*16);
+ struct timeval t;
+ int pid = IVAL(p,12);
+ int mode = IVAL(p,8);
+
+ t.tv_sec = IVAL(p,0);
+ t.tv_usec = IVAL(p,4);
+#endif /* FAST_SHARE_MODES */
fname[sizeof(fname)-1] = 0;
@@ -349,28 +433,38 @@ unsigned int Ucrit_IsActive = 0; /* added by OH */
}
printf(" %s %s",fname,asctime(LocalTime((time_t *)&t.tv_sec)));
-#if FAST_SHARE_MODES
- prev_p = scanner_p ;
- scanner_p = (share_mode_record *)smb_shm_offset2addr(scanner_p->next_offset);
- } /* end while */
+#ifdef FAST_SHARE_MODES
+
+ entry_scanner_p = (share_mode_entry *)smb_shm_offset2addr(
+ entry_scanner_p->next_share_mode_entry);
+ } /* end while entry_scanner_p */
+ file_scanner_p = (share_mode_record *)smb_shm_offset2addr(
+ file_scanner_p->next_offset);
+ } /* end while file_scanner_p */
+ smb_shm_unlock_hash_entry(i);
+ } /* end for */
smb_shm_get_usage(&bytes_free, &bytes_used, &bytes_overhead);
bytes_total = bytes_free + bytes_used + bytes_overhead;
- smb_shm_unlock();
/*******************************************************************
deinitialize the shared memory for share_mode management
******************************************************************/
smb_shm_close();
-#else
+#else /* FAST_SHARE_MODES */
+ } /* end for i */
+
+ if(buf)
+ free(buf);
+ base = 0;
} /* end while */
closedir(dir);
-#endif
+#endif /* FAST_SHARE_MODES */
if (firstopen)
printf("No locked files\n");
-#if FAST_SHARE_MODES
+#ifdef FAST_SHARE_MODES
printf("\nShare mode memory usage (bytes):\n");
printf(" %d(%d%%) free + %d(%d%%) used + %d(%d%%) overhead = %d(100%%) total\n",
bytes_free, (bytes_free * 100)/bytes_total,
@@ -378,7 +472,7 @@ unsigned int Ucrit_IsActive = 0; /* added by OH */
bytes_overhead, (bytes_overhead * 100)/bytes_total,
bytes_total);
-#endif
+#endif /* FAST_SHARE_MODES */
return (0);
}