summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/includes.h2
-rw-r--r--source3/include/session.h41
-rw-r--r--source3/param/loadparm.c10
-rw-r--r--source3/smbd/reply.c4
-rw-r--r--source3/smbd/server.c8
-rw-r--r--source3/smbd/session.c43
-rw-r--r--source3/utils/status.c104
-rw-r--r--source3/web/statuspage.c4
8 files changed, 105 insertions, 111 deletions
diff --git a/source3/include/includes.h b/source3/include/includes.h
index 63bcb1192e..8b138030ef 100644
--- a/source3/include/includes.h
+++ b/source3/include/includes.h
@@ -668,6 +668,8 @@ extern int errno;
#include "auth.h"
+#include "session.h"
+
#ifndef MAXCODEPAGELINES
#define MAXCODEPAGELINES 256
#endif
diff --git a/source3/include/session.h b/source3/include/session.h
new file mode 100644
index 0000000000..9091223e99
--- /dev/null
+++ b/source3/include/session.h
@@ -0,0 +1,41 @@
+/*
+ Unix SMB/Netbios implementation.
+ Version 2.0
+ session handling for recording currently vailid vuids
+ Copyright (C) tridge@samba.org 2001
+ Copyright (C) Andew Bartlett <abartlet@samba.org> 2001
+
+ 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.
+*/
+
+/* a "session" is claimed when we do a SessionSetupX operation
+ and is yielded when the corresponding vuid is destroyed.
+
+ sessions are used to populate utmp and PAM session structures
+*/
+
+struct sessionid {
+ uid_t uid;
+ gid_t gid;
+ fstring username;
+ fstring hostname;
+ fstring netbios_name;
+ fstring remote_machine;
+ fstring id_str;
+ uint32 id_num;
+ uint32 pid;
+ fstring ip_addr;
+};
+
diff --git a/source3/param/loadparm.c b/source3/param/loadparm.c
index 543e9bab9f..85bcd52ff1 100644
--- a/source3/param/loadparm.c
+++ b/source3/param/loadparm.c
@@ -149,7 +149,6 @@ typedef struct
#ifdef WITH_UTMP
char *szUtmpDir;
char *szWtmpDir;
- char *szUtmpHostname;
BOOL bUtmp;
#endif
char *szSourceEnv;
@@ -342,7 +341,6 @@ typedef struct
BOOL bCasePreserve;
BOOL bShortCasePreserve;
BOOL bCaseMangle;
- BOOL status;
BOOL bHideDotFiles;
BOOL bHideUnReadable;
BOOL bBrowseable;
@@ -457,7 +455,6 @@ static service sDefault = {
True, /* case preserve */
True, /* short case preserve */
False, /* case mangle */
- True, /* status */
True, /* bHideDotFiles */
False, /* bHideUnReadable */
True, /* bBrowseable */
@@ -762,8 +759,6 @@ static struct parm_struct parm_table[] = {
{"debug pid", P_BOOL, P_GLOBAL, &Globals.bDebugPid, NULL, NULL, 0},
{"debug uid", P_BOOL, P_GLOBAL, &Globals.bDebugUid, NULL, NULL, 0},
- {"status", P_BOOL, P_LOCAL, &sDefault.status, NULL, NULL, FLAG_GLOBAL | FLAG_SHARE | FLAG_PRINT},
-
{"Protocol Options", P_SEP, P_SEPARATOR},
{"protocol", P_ENUM, P_GLOBAL, &Globals.maxprotocol, NULL, enum_protocol, 0},
@@ -960,7 +955,6 @@ static struct parm_struct parm_table[] = {
#ifdef WITH_UTMP
{"utmp directory", P_STRING, P_GLOBAL, &Globals.szUtmpDir, NULL, NULL, 0},
{"wtmp directory", P_STRING, P_GLOBAL, &Globals.szWtmpDir, NULL, NULL, 0},
- {"utmp hostname", P_STRING, P_GLOBAL, &Globals.szUtmpHostname, NULL, NULL, 0},
{"utmp", P_BOOL, P_GLOBAL, &Globals.bUtmp, NULL, NULL, 0},
#endif
@@ -1193,7 +1187,6 @@ static void init_globals(void)
#ifdef WITH_UTMP
string_set(&Globals.szUtmpDir, "");
string_set(&Globals.szWtmpDir, "");
- string_set(&Globals.szUtmpHostname, "%m");
Globals.bUtmp = False;
#endif
string_set(&Globals.szSocketAddress, "0.0.0.0");
@@ -1436,7 +1429,6 @@ FN_GLOBAL_STRING(lp_lockdir, &Globals.szLockDir)
#ifdef WITH_UTMP
FN_GLOBAL_STRING(lp_utmpdir, &Globals.szUtmpDir)
FN_GLOBAL_STRING(lp_wtmpdir, &Globals.szWtmpDir)
-FN_GLOBAL_STRING(lp_utmp_hostname, &Globals.szUtmpHostname)
FN_GLOBAL_BOOL(lp_utmp, &Globals.bUtmp)
#endif
FN_GLOBAL_STRING(lp_rootdir, &Globals.szRootdir)
@@ -1643,7 +1635,6 @@ FN_LOCAL_BOOL(lp_casesensitive, bCaseSensitive)
FN_LOCAL_BOOL(lp_preservecase, bCasePreserve)
FN_LOCAL_BOOL(lp_shortpreservecase, bShortCasePreserve)
FN_LOCAL_BOOL(lp_casemangle, bCaseMangle)
-FN_LOCAL_BOOL(lp_status, status)
FN_LOCAL_BOOL(lp_hide_dot_files, bHideDotFiles)
FN_LOCAL_BOOL(lp_hideunreadable, bHideUnReadable)
FN_LOCAL_BOOL(lp_browseable, bBrowseable)
@@ -1883,7 +1874,6 @@ static BOOL lp_add_ipc(char *ipc_name, BOOL guest_ok)
string_set(&ServicePtrs[i]->szUsername, "");
string_set(&ServicePtrs[i]->comment, comment);
string_set(&ServicePtrs[i]->fstype, "IPC");
- ServicePtrs[i]->status = False;
ServicePtrs[i]->iMaxConnections = 0;
ServicePtrs[i]->bAvailable = True;
ServicePtrs[i]->bRead_only = True;
diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c
index bef1b15084..b4fb6693e6 100644
--- a/source3/smbd/reply.c
+++ b/source3/smbd/reply.c
@@ -127,9 +127,7 @@ int reply_special(char *inbuf,char *outbuf)
reload_services(True);
reopen_logs();
- if (lp_status(-1)) {
- claim_connection(NULL,"",MAXSTATUS,True);
- }
+ claim_connection(NULL,"",MAXSTATUS,True);
break;
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 13071a5b65..5bcb47393a 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -459,9 +459,7 @@ void exit_server(char *reason)
invalidate_all_vuids();
/* delete our entry in the connections database. */
- if (lp_status(-1)) {
- yield_connection(NULL,"",MAXSTATUS);
- }
+ yield_connection(NULL,"",MAXSTATUS);
respond_to_all_remaining_local_messages();
decrement_smbd_process_count();
@@ -751,9 +749,7 @@ static void usage(char *pname)
}
/* Setup the main smbd so that we can get messages. */
- if (lp_status(-1)) {
- claim_connection(NULL,"",MAXSTATUS,True);
- }
+ claim_connection(NULL,"",MAXSTATUS,True);
/* Attempt to migrate from an old 2.0.x machine account file. */
if (!migrate_from_old_password_file(global_myworkgroup)) {
diff --git a/source3/smbd/session.c b/source3/smbd/session.c
index 7616689fe0..78c635d7cf 100644
--- a/source3/smbd/session.c
+++ b/source3/smbd/session.c
@@ -28,17 +28,9 @@
#include "includes.h"
-#if defined(WITH_PAM) || defined(WITH_UTMP)
+extern fstring remote_machine;
static TDB_CONTEXT *tdb;
-struct sessionid {
- fstring username;
- fstring hostname;
- fstring id_str;
- uint32 id_num;
- uint32 pid;
-};
-
/* called when a session is created */
BOOL session_claim(uint16 vuid)
{
@@ -98,6 +90,10 @@ BOOL session_claim(uint16 vuid)
slprintf(sessionid.id_str, sizeof(sessionid.id_str)-1, SESSION_TEMPLATE, i);
sessionid.id_num = i;
sessionid.pid = pid;
+ sessionid.uid = vuser->uid;
+ sessionid.gid = vuser->gid;
+ fstrcpy(sessionid.remote_machine, remote_machine);
+ fstrcpy(sessionid.ip_addr, client_addr());
if (!smb_pam_claim_session(sessionid.username, sessionid.id_str, sessionid.hostname)) {
DEBUG(1,("pam_session rejected the session for %s [%s]\n",
@@ -106,12 +102,8 @@ BOOL session_claim(uint16 vuid)
return False;
}
- dlen = tdb_pack(dbuf, sizeof(dbuf), "fffdd",
- sessionid.username, sessionid.hostname, sessionid.id_str,
- sessionid.id_num, sessionid.pid);
-
- data.dptr = dbuf;
- data.dsize = dlen;
+ data.dptr = (char *)&sessionid;
+ data.dsize = sizeof(sessionid);
if (tdb_store(tdb, key, data, TDB_MODIFY) != 0) {
DEBUG(1,("session_claim: unable to create session id record\n"));
return False;
@@ -132,7 +124,7 @@ BOOL session_claim(uint16 vuid)
void session_yield(uint16 vuid)
{
user_struct *vuser = get_valid_user_struct(vuid);
- TDB_DATA data;
+ TDB_DATA dbuf;
struct sessionid sessionid;
TDB_DATA key;
fstring keystr;
@@ -148,17 +140,15 @@ void session_yield(uint16 vuid)
key.dptr = keystr;
key.dsize = strlen(keystr)+1;
- data = tdb_fetch(tdb, key);
- if (data.dptr == NULL) {
+ dbuf = tdb_fetch(tdb, key);
+
+ if (dbuf.dsize != sizeof(sessionid))
return;
- }
- tdb_unpack(data.dptr, data.dsize, "fffdd",
- &sessionid.username, &sessionid.hostname, &sessionid.id_str,
- &sessionid.id_num, &sessionid.pid);
+ memcpy(&sessionid, dbuf.dptr, sizeof(sessionid));
- safe_free(data.dptr);
- data.dptr = NULL;
+ safe_free(dbuf.dptr);
+ dbuf.dptr = NULL;
#if WITH_UTMP
if (lp_utmp()) {
@@ -172,8 +162,3 @@ void session_yield(uint16 vuid)
tdb_delete(tdb, key);
}
-#else
- /* null functions - no session support needed */
- BOOL session_claim(uint16 vuid) { return True; }
- void session_yield(uint16 vuid) {}
-#endif
diff --git a/source3/utils/status.c b/source3/utils/status.c
index e5beb6403c..36de6858f1 100644
--- a/source3/utils/status.c
+++ b/source3/utils/status.c
@@ -198,41 +198,33 @@ static int traverse_fn1(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *st
return 0;
}
- if (brief) {
- ptr=srecs;
- while (ptr!=NULL) {
- if ((ptr->pid==crec.pid)&&(strncmp(ptr->machine,crec.machine,30)==0)) {
- if (ptr->start > crec.start)
- ptr->start=crec.start;
- break;
- }
- 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);
- 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)));
- }
+ printf("%-10.10s %5d %-12s %s",
+ crec.name,(int)crec.pid,
+ crec.machine,
+ asctime(LocalTime(&crec.start)));
+
+ return 0;
+}
+
+static int traverse_sessionid(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state)
+{
+ static pid_t last_pid;
+ struct session_record *ptr;
+ struct sessionid sessionid;
+
+ if (dbuf.dsize != sizeof(sessionid))
+ return 0;
+
+ memcpy(&sessionid, dbuf.dptr, sizeof(sessionid));
+
+ if (!process_exists(sessionid.pid) || !Ucrit_checkUsername(uidtoname(sessionid.uid))) {
+ return 0;
}
+ printf("%5d %-12s %-12s %-12s (%s)\n",
+ (int)sessionid.pid, uidtoname(sessionid.uid), gidtoname(sessionid.gid),
+ sessionid.remote_machine, sessionid.hostname);
+
return 0;
}
@@ -316,46 +308,38 @@ static int traverse_fn1(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *st
return profile_dump();
}
+ tdb = tdb_open_log(lock_path("sessionid.tdb"), 0, USE_TDB_MMAP_FLAG, O_RDONLY, 0);
+ if (!tdb) {
+ printf("sessionid.tdb not initialised\n");
+ }
+
+ if (locks_only) goto locks;
+
+ printf("\nSamba version %s\n",VERSION);
+ printf("PID Username Group Machine \n");
+ printf("-------------------------------------------------------------------\n");
+
+ tdb_traverse(tdb, traverse_sessionid, NULL);
+ tdb_close(tdb);
+
tdb = tdb_open_log(lock_path("connections.tdb"), 0, USE_TDB_MMAP_FLAG, O_RDONLY, 0);
if (!tdb) {
printf("connections.tdb not initialised\n");
- 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);
}
- if (locks_only) goto locks;
+ if (brief)
+ exit(0);
+
+ printf("\nService pid machine Connected at\n");
+ printf("-------------------------------------------------------\n");
- printf("\nSamba version %s\n",VERSION);
- if (brief) {
- printf("PID Username Machine Time logged in\n");
- printf("-------------------------------------------------------------------\n");
- } else {
- printf("Service uid gid pid machine\n");
- printf("----------------------------------------------\n");
- }
tdb_traverse(tdb, traverse_fn1, NULL);
tdb_close(tdb);
locks:
if (processes_only) exit(0);
-
- if (brief) {
- ptr=srecs;
- while (ptr!=NULL) {
- printf("%-8d%-10.10s%-30.30s%s",
- (int)ptr->pid,uidtoname(ptr->uid),
- ptr->machine,
- asctime(LocalTime(&(ptr->start))));
- ptr=ptr->next;
- }
- printf("\n");
- exit(0);
- }
-
- printf("\n");
if (!shares_only) {
int ret;
diff --git a/source3/web/statuspage.c b/source3/web/statuspage.c
index dc26e86ef8..c112deb224 100644
--- a/source3/web/statuspage.c
+++ b/source3/web/statuspage.c
@@ -209,9 +209,7 @@ void status_page(void)
if (!tdb) {
/* 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");
+ made */
}