mirror of
https://github.com/samba-team/samba.git
synced 2025-03-27 22:50:26 +03:00
r22761: This introduces lib/conn_tdb.c with two main functions: connections_traverse
and connections_forall. This centralizes all the routines that did individual tdb_open("connections.tdb") and direct tdb_traverse. Volker (This used to be commit e43e94cda1ad8876b3cb5d1129080b57fa6ec214)
This commit is contained in:
parent
dcc2fe7cb6
commit
4aa44f7475
@ -272,7 +272,7 @@ LIB_WITH_PROTO_OBJ = $(VERSION_OBJ) lib/charcnv.o lib/debug.o lib/fault.o \
|
||||
lib/tallocmsg.o lib/dmallocmsg.o libsmb/smb_signing.o \
|
||||
lib/md5.o lib/hmacmd5.o lib/arc4.o lib/iconv.o \
|
||||
nsswitch/wb_client.o $(WBCOMMON_OBJ) \
|
||||
lib/pam_errors.o intl/lang_tdb.o \
|
||||
lib/pam_errors.o intl/lang_tdb.o lib/conn_tdb.o \
|
||||
lib/adt_tree.o lib/gencache.o $(TDB_OBJ) \
|
||||
lib/module.o lib/events.o lib/ldap_escape.o @CHARSET_STATIC@ \
|
||||
lib/secdesc.o lib/util_seaccess.o lib/secace.o lib/secacl.o \
|
||||
|
109
source3/lib/conn_tdb.c
Normal file
109
source3/lib/conn_tdb.c
Normal file
@ -0,0 +1,109 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
Low-level connections.tdb access functions
|
||||
Copyright (C) Volker Lendecke 2007
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
TDB_CONTEXT *conn_tdb_ctx(BOOL rw)
|
||||
{
|
||||
static TDB_CONTEXT *tdb;
|
||||
|
||||
if (tdb != NULL) {
|
||||
return tdb;
|
||||
}
|
||||
|
||||
if (rw) {
|
||||
tdb = tdb_open_log(lock_path("connections.tdb"), 0,
|
||||
TDB_CLEAR_IF_FIRST|TDB_DEFAULT,
|
||||
O_RDWR | O_CREAT, 0644);
|
||||
}
|
||||
else {
|
||||
tdb = tdb_open_log(lock_path("connections.tdb"), 0,
|
||||
TDB_DEFAULT, O_RDONLY, 0);
|
||||
}
|
||||
|
||||
if (tdb == NULL) {
|
||||
DEBUG(0, ("Could not open connections.tdb: %s\n",
|
||||
strerror(errno)));
|
||||
}
|
||||
|
||||
return tdb;
|
||||
}
|
||||
|
||||
struct conn_traverse_state {
|
||||
int (*fn)(TDB_CONTEXT *tdb,
|
||||
const struct connections_key *key,
|
||||
const struct connections_data *data,
|
||||
void *private_data);
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
static int conn_traverse_fn(TDB_CONTEXT *tdb, TDB_DATA key,
|
||||
TDB_DATA data, void *private_data)
|
||||
{
|
||||
struct conn_traverse_state *state =
|
||||
(struct conn_traverse_state *)private_data;
|
||||
|
||||
if ((key.dsize != sizeof(struct connections_key))
|
||||
|| (data.dsize != sizeof(struct connections_data))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return state->fn(
|
||||
tdb, (const struct connections_key *)key.dptr,
|
||||
(const struct connections_data *)data.dptr,
|
||||
state->private_data);
|
||||
}
|
||||
|
||||
int connections_traverse(int (*fn)(TDB_CONTEXT *tdb, TDB_DATA key,
|
||||
TDB_DATA data, void *private_data),
|
||||
void *private_data)
|
||||
{
|
||||
TDB_CONTEXT *tdb = conn_tdb_ctx(True);
|
||||
|
||||
if (tdb == NULL) {
|
||||
DEBUG(5, ("Could not open connections.tdb r/w, trying r/o\n"));
|
||||
tdb = conn_tdb_ctx(False);
|
||||
}
|
||||
|
||||
if (tdb == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
return tdb_traverse(tdb, fn, private_data);
|
||||
}
|
||||
|
||||
int connections_forall(int (*fn)(TDB_CONTEXT *tdb,
|
||||
const struct connections_key *key,
|
||||
const struct connections_data *data,
|
||||
void *private_data),
|
||||
void *private_data)
|
||||
{
|
||||
struct conn_traverse_state state;
|
||||
|
||||
state.fn = fn;
|
||||
state.private_data = private_data;
|
||||
|
||||
return connections_traverse(conn_traverse_fn, (void *)&state);
|
||||
}
|
||||
|
||||
BOOL connections_init(BOOL rw)
|
||||
{
|
||||
return (conn_tdb_ctx(rw) != NULL);
|
||||
}
|
@ -665,7 +665,7 @@ static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void
|
||||
*
|
||||
* @retval True for success.
|
||||
**/
|
||||
BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type,
|
||||
BOOL message_send_all(int msg_type,
|
||||
const void *buf, size_t len,
|
||||
BOOL duplicates_allowed,
|
||||
int *n_sent)
|
||||
@ -691,7 +691,7 @@ BOOL message_send_all(TDB_CONTEXT *conn_tdb, int msg_type,
|
||||
msg_all.duplicates = duplicates_allowed;
|
||||
msg_all.n_sent = 0;
|
||||
|
||||
tdb_traverse(conn_tdb, traverse_fn, &msg_all);
|
||||
connections_traverse(traverse_fn, &msg_all);
|
||||
if (n_sent)
|
||||
*n_sent = msg_all.n_sent;
|
||||
return True;
|
||||
|
@ -38,24 +38,10 @@ Send a message to smbd to do a sam delta sync
|
||||
|
||||
static void send_repl_message(uint32 low_serial)
|
||||
{
|
||||
TDB_CONTEXT *tdb;
|
||||
|
||||
tdb = tdb_open_log(lock_path("connections.tdb"), 0,
|
||||
TDB_DEFAULT, O_RDONLY, 0);
|
||||
|
||||
if (!tdb) {
|
||||
DEBUG(3, ("send_repl_message(): failed to open connections "
|
||||
"database\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
DEBUG(3, ("sending replication message, serial = 0x%04x\n",
|
||||
low_serial));
|
||||
|
||||
message_send_all(tdb, MSG_SMB_SAM_REPL, &low_serial,
|
||||
message_send_all(MSG_SMB_SAM_REPL, &low_serial,
|
||||
sizeof(low_serial), False, NULL);
|
||||
|
||||
tdb_close(tdb);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
|
@ -75,22 +75,8 @@ Send a message to smbd to do a sam synchronisation
|
||||
|
||||
static void send_sync_message(void)
|
||||
{
|
||||
TDB_CONTEXT *tdb;
|
||||
|
||||
tdb = tdb_open_log(lock_path("connections.tdb"), 0,
|
||||
TDB_DEFAULT, O_RDONLY, 0);
|
||||
|
||||
if (!tdb) {
|
||||
DEBUG(3, ("send_sync_message(): failed to open connections "
|
||||
"database\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
DEBUG(3, ("sending sam synchronisation message\n"));
|
||||
|
||||
message_send_all(tdb, MSG_SMB_SAM_SYNC, NULL, 0, False, NULL);
|
||||
|
||||
tdb_close(tdb);
|
||||
message_send_all(MSG_SMB_SAM_SYNC, NULL, 0, False, NULL);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
|
@ -311,7 +311,7 @@ WERROR delete_printer_hook( NT_USER_TOKEN *token, const char *sharename )
|
||||
|
||||
if ( (ret = smbrun(command, NULL)) == 0 ) {
|
||||
/* Tell everyone we updated smb.conf. */
|
||||
message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
|
||||
message_send_all(MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
|
||||
}
|
||||
|
||||
if ( is_print_op )
|
||||
@ -6253,7 +6253,7 @@ BOOL add_printer_hook(NT_USER_TOKEN *token, NT_PRINTER_INFO_LEVEL *printer)
|
||||
|
||||
if ( (ret = smbrun(command, &fd)) == 0 ) {
|
||||
/* Tell everyone we updated smb.conf. */
|
||||
message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
|
||||
message_send_all(MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
|
||||
}
|
||||
|
||||
if ( is_print_op )
|
||||
|
@ -104,27 +104,22 @@ static WERROR net_enum_pipes( TALLOC_CTX *ctx, struct srvsvc_NetFileInfo3 **info
|
||||
uint32 *count, uint32 *resume )
|
||||
{
|
||||
struct file_enum_count fenum;
|
||||
TDB_CONTEXT *conn_tdb = conn_tdb_ctx();
|
||||
|
||||
if ( !conn_tdb ) {
|
||||
DEBUG(0,("net_enum_pipes: Failed to retrieve the connections tdb handle!\n"));
|
||||
return WERR_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
fenum.ctx = ctx;
|
||||
fenum.info = *info;
|
||||
fenum.count = *count;
|
||||
|
||||
if (tdb_traverse(conn_tdb, pipe_enum_fn, &fenum) == -1) {
|
||||
DEBUG(0,("net_enum_pipes: traverse of connections.tdb failed with error %s.\n",
|
||||
tdb_errorstr(conn_tdb) ));
|
||||
if (connections_traverse(pipe_enum_fn, &fenum) == -1) {
|
||||
DEBUG(0,("net_enum_pipes: traverse of connections.tdb "
|
||||
"failed\n"));
|
||||
return WERR_NOMEM;
|
||||
}
|
||||
|
||||
*info = fenum.info;
|
||||
*count = fenum.count;
|
||||
|
||||
return WERR_OK;}
|
||||
return WERR_OK;
|
||||
}
|
||||
|
||||
/*******************************************************************
|
||||
********************************************************************/
|
||||
@ -1421,7 +1416,7 @@ static WERROR add_share(const char *share_name, const char *path,
|
||||
|
||||
if ( (ret = smbrun(command, NULL)) == 0 ) {
|
||||
/* Tell everyone we updated smb.conf. */
|
||||
message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED,
|
||||
message_send_all(MSG_SMB_CONF_UPDATED,
|
||||
NULL, 0, False, NULL);
|
||||
}
|
||||
|
||||
@ -1517,7 +1512,7 @@ static WERROR delete_share(const char *sharename,
|
||||
|
||||
if ( (ret = smbrun(command, NULL)) == 0 ) {
|
||||
/* Tell everyone we updated smb.conf. */
|
||||
message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED,
|
||||
message_send_all(MSG_SMB_CONF_UPDATED,
|
||||
NULL, 0, False, NULL);
|
||||
}
|
||||
|
||||
@ -1575,7 +1570,7 @@ static WERROR change_share(const char *share_name, const char *path,
|
||||
|
||||
if ( (ret = smbrun(command, NULL)) == 0 ) {
|
||||
/* Tell everyone we updated smb.conf. */
|
||||
message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED,
|
||||
message_send_all(MSG_SMB_CONF_UPDATED,
|
||||
NULL, 0, False, NULL);
|
||||
}
|
||||
|
||||
|
@ -20,21 +20,6 @@
|
||||
|
||||
#include "includes.h"
|
||||
|
||||
static TDB_CONTEXT *tdb;
|
||||
|
||||
/****************************************************************************
|
||||
Return the connection tdb context (used for message send all).
|
||||
****************************************************************************/
|
||||
|
||||
TDB_CONTEXT *conn_tdb_ctx(void)
|
||||
{
|
||||
if (!tdb)
|
||||
tdb = tdb_open_log(lock_path("connections.tdb"), 0, TDB_CLEAR_IF_FIRST|TDB_DEFAULT,
|
||||
O_RDWR | O_CREAT, 0644);
|
||||
|
||||
return tdb;
|
||||
}
|
||||
|
||||
static void make_conn_key(connection_struct *conn, const char *name, TDB_DATA *pkbuf, struct connections_key *pkey)
|
||||
{
|
||||
ZERO_STRUCTP(pkey);
|
||||
@ -62,6 +47,7 @@ BOOL yield_connection(connection_struct *conn, const char *name)
|
||||
{
|
||||
struct connections_key key;
|
||||
TDB_DATA kbuf;
|
||||
TDB_CONTEXT *tdb = conn_tdb_ctx(True);
|
||||
|
||||
if (!tdb)
|
||||
return False;
|
||||
@ -112,7 +98,7 @@ static int count_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *u
|
||||
DEBUG(2,("pid %s doesn't exist - deleting connections %d [%s]\n",
|
||||
procid_str_static(&crec.pid), crec.cnum, crec.servicename));
|
||||
if (tdb_delete(the_tdb, kbuf) != 0)
|
||||
DEBUG(0,("count_fn: tdb_delete failed with error %s\n", tdb_errorstr(tdb) ));
|
||||
DEBUG(0,("count_fn: tdb_delete failed with error %s\n", tdb_errorstr(the_tdb) ));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -139,6 +125,7 @@ static int count_fn( TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *u
|
||||
int count_current_connections( const char *sharename, BOOL clear )
|
||||
{
|
||||
struct count_stat cs;
|
||||
TDB_CONTEXT *tdb = conn_tdb_ctx(True);
|
||||
|
||||
cs.mypid = sys_getpid();
|
||||
cs.curr_connections = 0;
|
||||
@ -184,11 +171,10 @@ BOOL claim_connection(connection_struct *conn, const char *name,int max_connecti
|
||||
struct connections_key key;
|
||||
struct connections_data crec;
|
||||
TDB_DATA kbuf, dbuf;
|
||||
TDB_CONTEXT *tdb = conn_tdb_ctx(True);
|
||||
|
||||
if (!tdb) {
|
||||
if ( (tdb =conn_tdb_ctx()) == NULL ) {
|
||||
return False;
|
||||
}
|
||||
return False;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -245,6 +231,7 @@ BOOL register_message_flags(BOOL doreg, uint32 msg_flags)
|
||||
struct connections_key key;
|
||||
struct connections_data *pcrec;
|
||||
TDB_DATA kbuf, dbuf;
|
||||
TDB_CONTEXT *tdb = conn_tdb_ctx(True);
|
||||
|
||||
if (!tdb)
|
||||
return False;
|
||||
@ -344,7 +331,7 @@ BOOL store_pipe_opendb( smb_np_struct *p )
|
||||
data.dptr = (uint8 *)prec;
|
||||
data.dsize = sizeof(struct pipe_open_rec);
|
||||
|
||||
if ( (pipe_tdb = conn_tdb_ctx() ) == NULL ) {
|
||||
if ( (pipe_tdb = conn_tdb_ctx(True) ) == NULL ) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
@ -375,7 +362,7 @@ BOOL delete_pipe_opendb( smb_np_struct *p )
|
||||
goto done;
|
||||
}
|
||||
|
||||
if ( (pipe_tdb = conn_tdb_ctx() ) == NULL ) {
|
||||
if ( (pipe_tdb = conn_tdb_ctx(True) ) == NULL ) {
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
@ -1894,7 +1894,8 @@ static BOOL api_RNetShareAdd(connection_struct *conn,uint16 vuid,
|
||||
goto error_exit;
|
||||
} else {
|
||||
SAFE_FREE(command);
|
||||
message_send_all(conn_tdb_ctx(), MSG_SMB_CONF_UPDATED, NULL, 0, False, NULL);
|
||||
message_send_all(MSG_SMB_CONF_UPDATED, NULL, 0,
|
||||
False, NULL);
|
||||
}
|
||||
} else {
|
||||
return False;
|
||||
|
@ -987,7 +987,7 @@ extern void build_options(BOOL screen);
|
||||
if (!session_init())
|
||||
exit(1);
|
||||
|
||||
if (conn_tdb_ctx() == NULL)
|
||||
if (!connections_init(True))
|
||||
exit(1);
|
||||
|
||||
if (!locking_init(0))
|
||||
|
@ -292,8 +292,7 @@ BOOL stat_cache_lookup(connection_struct *conn, pstring name, pstring dirpath,
|
||||
void send_stat_cache_delete_message(const char *name)
|
||||
{
|
||||
#ifdef DEVELOPER
|
||||
message_send_all(conn_tdb_ctx(),
|
||||
MSG_SMB_STAT_CACHE_DELETE,
|
||||
message_send_all(MSG_SMB_STAT_CACHE_DELETE,
|
||||
name,
|
||||
strlen(name)+1,
|
||||
True,
|
||||
|
@ -84,27 +84,22 @@ static int net_status_sessions(int argc, const char **argv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int show_share(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf,
|
||||
static int show_share(TDB_CONTEXT *tdb,
|
||||
const struct connections_key *key,
|
||||
const struct connections_data *crec,
|
||||
void *state)
|
||||
{
|
||||
struct connections_data crec;
|
||||
|
||||
if (dbuf.dsize != sizeof(crec))
|
||||
if (crec->cnum == -1)
|
||||
return 0;
|
||||
|
||||
memcpy(&crec, dbuf.dptr, sizeof(crec));
|
||||
|
||||
if (crec.cnum == -1)
|
||||
return 0;
|
||||
|
||||
if (!process_exists(crec.pid)) {
|
||||
if (!process_exists(crec->pid)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
d_printf("%-10.10s %s %-12s %s",
|
||||
crec.servicename, procid_str_static(&crec.pid),
|
||||
crec.machine,
|
||||
time_to_asc(crec.start));
|
||||
crec->servicename, procid_str_static(&crec->pid),
|
||||
crec->machine,
|
||||
time_to_asc(crec->start));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -139,41 +134,37 @@ static int collect_pid(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int show_share_parseable(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf,
|
||||
static int show_share_parseable(TDB_CONTEXT *tdb,
|
||||
const struct connections_key *key,
|
||||
const struct connections_data *crec,
|
||||
void *state)
|
||||
{
|
||||
struct sessionids *ids = (struct sessionids *)state;
|
||||
struct connections_data crec;
|
||||
int i;
|
||||
BOOL guest = True;
|
||||
|
||||
if (dbuf.dsize != sizeof(crec))
|
||||
if (crec->cnum == -1)
|
||||
return 0;
|
||||
|
||||
memcpy(&crec, dbuf.dptr, sizeof(crec));
|
||||
|
||||
if (crec.cnum == -1)
|
||||
return 0;
|
||||
|
||||
if (!process_exists(crec.pid)) {
|
||||
if (!process_exists(crec->pid)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i=0; i<ids->num_entries; i++) {
|
||||
struct server_id id = ids->entries[i].pid;
|
||||
if (procid_equal(&id, &crec.pid)) {
|
||||
if (procid_equal(&id, &crec->pid)) {
|
||||
guest = False;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
d_printf("%s\\%s\\%s\\%s\\%s\\%s\\%s",
|
||||
crec.servicename,procid_str_static(&crec.pid),
|
||||
crec->servicename,procid_str_static(&crec->pid),
|
||||
guest ? "" : uidtoname(ids->entries[i].uid),
|
||||
guest ? "" : gidtoname(ids->entries[i].gid),
|
||||
crec.machine,
|
||||
crec->machine,
|
||||
guest ? "" : ids->entries[i].hostname,
|
||||
time_to_asc(crec.start));
|
||||
time_to_asc(crec->start));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -197,18 +188,7 @@ static int net_status_shares_parseable(int argc, const char **argv)
|
||||
tdb_traverse(tdb, collect_pid, &ids);
|
||||
tdb_close(tdb);
|
||||
|
||||
tdb = tdb_open_log(lock_path("connections.tdb"), 0,
|
||||
TDB_DEFAULT, O_RDONLY, 0);
|
||||
|
||||
if (tdb == NULL) {
|
||||
d_fprintf(stderr, "%s not initialised\n", lock_path("connections.tdb"));
|
||||
d_fprintf(stderr, "This is normal if no SMB client has ever "
|
||||
"connected to your server.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
tdb_traverse(tdb, show_share_parseable, &ids);
|
||||
tdb_close(tdb);
|
||||
connections_forall(show_share_parseable, &ids);
|
||||
|
||||
SAFE_FREE(ids.entries);
|
||||
|
||||
@ -217,8 +197,6 @@ static int net_status_shares_parseable(int argc, const char **argv)
|
||||
|
||||
static int net_status_shares(int argc, const char **argv)
|
||||
{
|
||||
TDB_CONTEXT *tdb;
|
||||
|
||||
if (argc == 0) {
|
||||
|
||||
d_printf("\nService pid machine "
|
||||
@ -226,19 +204,7 @@ static int net_status_shares(int argc, const char **argv)
|
||||
d_printf("-------------------------------------"
|
||||
"------------------\n");
|
||||
|
||||
tdb = tdb_open_log(lock_path("connections.tdb"), 0,
|
||||
TDB_DEFAULT, O_RDONLY, 0);
|
||||
|
||||
if (tdb == NULL) {
|
||||
d_fprintf(stderr, "%s not initialised\n",
|
||||
lock_path("connections.tdb"));
|
||||
d_fprintf(stderr, "This is normal if no SMB client has "
|
||||
"ever connected to your server.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
tdb_traverse(tdb, show_share, NULL);
|
||||
tdb_close(tdb);
|
||||
connections_forall(show_share, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -51,7 +51,6 @@ static BOOL send_message(struct server_id pid, int msg_type,
|
||||
const void *buf, int len,
|
||||
BOOL duplicates)
|
||||
{
|
||||
TDB_CONTEXT *tdb;
|
||||
BOOL ret;
|
||||
int n_sent = 0;
|
||||
|
||||
@ -62,21 +61,11 @@ static BOOL send_message(struct server_id pid, int msg_type,
|
||||
return NT_STATUS_IS_OK(message_send_pid(pid, msg_type, buf, len,
|
||||
duplicates));
|
||||
|
||||
tdb = tdb_open_log(lock_path("connections.tdb"), 0,
|
||||
TDB_DEFAULT, O_RDWR, 0);
|
||||
if (!tdb) {
|
||||
fprintf(stderr,"Failed to open connections database"
|
||||
": %s\n", strerror(errno));
|
||||
return False;
|
||||
}
|
||||
|
||||
ret = message_send_all(tdb,msg_type, buf, len, duplicates,
|
||||
ret = message_send_all(msg_type, buf, len, duplicates,
|
||||
&n_sent);
|
||||
DEBUG(10,("smbcontrol/send_message: broadcast message to "
|
||||
"%d processes\n", n_sent));
|
||||
|
||||
tdb_close(tdb);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -247,16 +236,11 @@ cleanup:
|
||||
ptrace(PTRACE_DETACH, pid, NULL, NULL);
|
||||
}
|
||||
|
||||
static int stack_trace_connection(TDB_CONTEXT * tdb, TDB_DATA key,
|
||||
TDB_DATA data, void * priv)
|
||||
static int stack_trace_connection(TDB_CONTEXT * tdb,
|
||||
const struct connections_key *key,
|
||||
const struct connections_data *conn,
|
||||
{
|
||||
struct connections_data conn;
|
||||
|
||||
if (data.dsize != sizeof(conn))
|
||||
return 0;
|
||||
|
||||
memcpy(&conn, data.dptr, sizeof(conn));
|
||||
print_stack_trace(procid_to_pid(&conn.pid), (int *)priv);
|
||||
print_stack_trace(procid_to_pid(&conn->pid), (int *)priv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -286,19 +270,7 @@ static BOOL do_daemon_stack_trace(const struct server_id pid,
|
||||
*/
|
||||
print_stack_trace(dest, &count);
|
||||
} else {
|
||||
TDB_CONTEXT * tdb;
|
||||
|
||||
tdb = tdb_open_log(lock_path("connections.tdb"), 0,
|
||||
TDB_DEFAULT, O_RDONLY, 0);
|
||||
if (!tdb) {
|
||||
fprintf(stderr,
|
||||
"Failed to open connections database: %s\n",
|
||||
strerror(errno));
|
||||
return False;
|
||||
}
|
||||
|
||||
tdb_traverse(tdb, stack_trace_connection, &count);
|
||||
tdb_close(tdb);
|
||||
connections_traverse(stack_trace_connection, &count);
|
||||
}
|
||||
|
||||
return True;
|
||||
|
@ -188,26 +188,22 @@ static void print_brl(SMB_DEV_T dev,
|
||||
(double)start, (double)size);
|
||||
}
|
||||
|
||||
static int traverse_fn1(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void *state)
|
||||
static int traverse_fn1(TDB_CONTEXT *tdb,
|
||||
const struct connections_key *key,
|
||||
const struct connections_data *crec,
|
||||
void *state)
|
||||
{
|
||||
struct connections_data crec;
|
||||
|
||||
if (dbuf.dsize != sizeof(crec))
|
||||
if (crec->cnum == -1)
|
||||
return 0;
|
||||
|
||||
memcpy(&crec, dbuf.dptr, sizeof(crec));
|
||||
|
||||
if (crec.cnum == -1)
|
||||
return 0;
|
||||
|
||||
if (!process_exists(crec.pid) || !Ucrit_checkUid(crec.uid)) {
|
||||
if (!process_exists(crec->pid) || !Ucrit_checkUid(crec->uid)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
d_printf("%-10s %s %-12s %s",
|
||||
crec.servicename,procid_str_static(&crec.pid),
|
||||
crec.machine,
|
||||
time_to_asc(crec.start));
|
||||
crec->servicename,procid_str_static(&crec->pid),
|
||||
crec->machine,
|
||||
time_to_asc(crec->start));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -339,27 +335,20 @@ static int traverse_sessionid(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, vo
|
||||
}
|
||||
|
||||
if ( show_shares ) {
|
||||
tdb = tdb_open_log(lock_path("connections.tdb"), 0, TDB_DEFAULT, O_RDONLY, 0);
|
||||
if (!tdb) {
|
||||
d_printf("%s not initialised\n", lock_path("connections.tdb"));
|
||||
d_printf("This is normal if an SMB client has never connected to your server.\n");
|
||||
} else {
|
||||
if (verbose) {
|
||||
d_printf("Opened %s\n", lock_path("connections.tdb"));
|
||||
}
|
||||
|
||||
if (brief)
|
||||
exit(0);
|
||||
|
||||
d_printf("\nService pid machine Connected at\n");
|
||||
d_printf("-------------------------------------------------------\n");
|
||||
|
||||
tdb_traverse(tdb, traverse_fn1, NULL);
|
||||
tdb_close(tdb);
|
||||
|
||||
d_printf("\n");
|
||||
if (verbose) {
|
||||
d_printf("Opened %s\n", lock_path("connections.tdb"));
|
||||
}
|
||||
|
||||
if (brief)
|
||||
exit(0);
|
||||
|
||||
d_printf("\nService pid machine Connected at\n");
|
||||
d_printf("-------------------------------------------------------\n");
|
||||
|
||||
connections_forall(traverse_fn1, NULL);
|
||||
|
||||
d_printf("\n");
|
||||
|
||||
if ( shares_only )
|
||||
exit(0);
|
||||
}
|
||||
|
@ -167,20 +167,17 @@ static void print_share_mode(const struct share_mode_entry *e,
|
||||
|
||||
|
||||
/* kill off any connections chosen by the user */
|
||||
static int traverse_fn1(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void* state)
|
||||
static int traverse_fn1(TDB_CONTEXT *tdb,
|
||||
const struct connections_key *key,
|
||||
const struct connections_data *crec,
|
||||
void* state)
|
||||
{
|
||||
struct connections_data crec;
|
||||
|
||||
if (dbuf.dsize != sizeof(crec))
|
||||
return 0;
|
||||
|
||||
memcpy(&crec, dbuf.dptr, sizeof(crec));
|
||||
|
||||
if (crec.cnum == -1 && process_exists(crec.pid)) {
|
||||
if (crec->cnum == -1 && process_exists(crec->pid)) {
|
||||
char buf[30];
|
||||
slprintf(buf,sizeof(buf)-1,"kill_%s", procid_str_static(&crec.pid));
|
||||
slprintf(buf, sizeof(buf)-1,"kill_%s",
|
||||
procid_str_static(&crec->pid));
|
||||
if (cgi_variable(buf)) {
|
||||
kill_pid(crec.pid);
|
||||
kill_pid(crec->pid);
|
||||
sleep(SLEEP_TIME);
|
||||
}
|
||||
}
|
||||
@ -188,28 +185,24 @@ static int traverse_fn1(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void* st
|
||||
}
|
||||
|
||||
/* traversal fn for showing machine connections */
|
||||
static int traverse_fn2(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void* state)
|
||||
static int traverse_fn2(TDB_CONTEXT *tdb,
|
||||
const struct connections_key *key,
|
||||
const struct connections_data *crec,
|
||||
void* state)
|
||||
{
|
||||
struct connections_data crec;
|
||||
|
||||
if (dbuf.dsize != sizeof(crec))
|
||||
if (crec->cnum == -1 || !process_exists(crec->pid) ||
|
||||
procid_equal(&crec->pid, &smbd_pid))
|
||||
return 0;
|
||||
|
||||
memcpy(&crec, dbuf.dptr, sizeof(crec));
|
||||
|
||||
if (crec.cnum == -1 || !process_exists(crec.pid) ||
|
||||
procid_equal(&crec.pid, &smbd_pid))
|
||||
return 0;
|
||||
|
||||
addPid2Machine (crec.pid, crec.machine);
|
||||
addPid2Machine (crec->pid, crec->machine);
|
||||
|
||||
printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td>\n",
|
||||
procid_str_static(&crec.pid),
|
||||
crec.machine,crec.addr,
|
||||
tstring(crec.start));
|
||||
procid_str_static(&crec->pid),
|
||||
crec->machine, crec->addr,
|
||||
tstring(crec->start));
|
||||
if (geteuid() == 0) {
|
||||
printf("<td><input type=submit value=\"X\" name=\"kill_%s\"></td>\n",
|
||||
procid_str_static(&crec.pid));
|
||||
procid_str_static(&crec->pid));
|
||||
}
|
||||
printf("</tr>\n");
|
||||
|
||||
@ -217,23 +210,19 @@ static int traverse_fn2(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void* st
|
||||
}
|
||||
|
||||
/* traversal fn for showing share connections */
|
||||
static int traverse_fn3(TDB_CONTEXT *tdb, TDB_DATA kbuf, TDB_DATA dbuf, void* state)
|
||||
static int traverse_fn3(TDB_CONTEXT *tdb,
|
||||
const struct connections_key *key,
|
||||
const struct connections_data *crec,
|
||||
void* state)
|
||||
{
|
||||
struct connections_data crec;
|
||||
|
||||
if (dbuf.dsize != sizeof(crec))
|
||||
return 0;
|
||||
|
||||
memcpy(&crec, dbuf.dptr, sizeof(crec));
|
||||
|
||||
if (crec.cnum == -1 || !process_exists(crec.pid))
|
||||
if (crec->cnum == -1 || !process_exists(crec->pid))
|
||||
return 0;
|
||||
|
||||
printf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
|
||||
crec.servicename,uidtoname(crec.uid),
|
||||
gidtoname(crec.gid),procid_str_static(&crec.pid),
|
||||
crec.machine,
|
||||
tstring(crec.start));
|
||||
crec->servicename, uidtoname(crec->uid),
|
||||
gidtoname(crec->gid),procid_str_static(&crec->pid),
|
||||
crec->machine,
|
||||
tstring(crec->start));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -244,7 +233,6 @@ void status_page(void)
|
||||
const char *v;
|
||||
int autorefresh=0;
|
||||
int refresh_interval=30;
|
||||
TDB_CONTEXT *tdb;
|
||||
int nr_running=0;
|
||||
BOOL waitup = False;
|
||||
|
||||
@ -322,8 +310,7 @@ void status_page(void)
|
||||
PID_or_Machine = 0;
|
||||
}
|
||||
|
||||
tdb = tdb_open_log(lock_path("connections.tdb"), 0, TDB_DEFAULT, O_RDONLY, 0);
|
||||
if (tdb) tdb_traverse(tdb, traverse_fn1, NULL);
|
||||
connections_forall(traverse_fn1, NULL);
|
||||
|
||||
initPid2Machine ();
|
||||
|
||||
@ -344,12 +331,6 @@ void status_page(void)
|
||||
|
||||
printf("<p>\n");
|
||||
|
||||
if (!tdb) {
|
||||
/* open failure either means no connections have been
|
||||
made */
|
||||
}
|
||||
|
||||
|
||||
printf("<table>\n");
|
||||
|
||||
printf("<tr><td>%s</td><td>%s</td></tr>", _("version:"), SAMBA_VERSION_STRING);
|
||||
@ -419,7 +400,7 @@ void status_page(void)
|
||||
}
|
||||
printf("</tr>\n");
|
||||
|
||||
if (tdb) tdb_traverse(tdb, traverse_fn2, NULL);
|
||||
connections_forall(traverse_fn2, NULL);
|
||||
|
||||
printf("</table><p>\n");
|
||||
|
||||
@ -428,7 +409,7 @@ void status_page(void)
|
||||
printf("<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n\n",
|
||||
_("Share"), _("User"), _("Group"), _("PID"), _("Client"), _("Date"));
|
||||
|
||||
if (tdb) tdb_traverse(tdb, traverse_fn3, NULL);
|
||||
connections_forall(traverse_fn3, NULL);
|
||||
|
||||
printf("</table><p>\n");
|
||||
|
||||
@ -441,8 +422,6 @@ void status_page(void)
|
||||
locking_end();
|
||||
printf("</table>\n");
|
||||
|
||||
if (tdb) tdb_close(tdb);
|
||||
|
||||
printf("<br><input type=submit name=\"show_client_in_col_1\" value=\"%s\">\n", _("Show Client in col 1"));
|
||||
printf("<input type=submit name=\"show_pid_in_col_1\" value=\"%s\">\n", _("Show PID in col 1"));
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user