From 16b1c77644217796f70a3a0bf1d95c245f9ee2d9 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Wed, 8 Jun 2011 14:05:55 +1000 Subject: [PATCH] lib/util Bring procid_str() into lib/util as server_id_string() This is needed for OpenChange, which prints Samba struct server_id values in debug messages. Andrew Bartlett --- lib/util/server_id.c | 36 +++++++++++++++++++++++++++++++ lib/util/util.h | 2 ++ lib/util/wscript_build | 3 ++- librpc/idl/server_id.idl | 7 ++++++ source3/Makefile.in | 2 +- source3/include/messages.h | 7 ------ source3/include/proto.h | 1 - source3/lib/g_lock.c | 10 ++++----- source3/lib/util.c | 18 +--------------- source3/locking/brlock.c | 2 +- source3/smbd/oplock.c | 10 ++++----- source3/smbd/sesssetup.c | 2 +- source3/utils/net_g_lock.c | 2 +- source3/utils/net_serverid.c | 12 +++++------ source3/utils/smbcontrol.c | 6 +++--- source4/cluster/cluster.c | 11 ---------- source4/cluster/cluster.h | 1 - source4/cluster/cluster_private.h | 2 -- source4/cluster/local.c | 11 ---------- source4/lib/messaging/messaging.c | 8 +++---- source4/smb_server/smb/receive.c | 2 +- source4/smbd/service_stream.c | 2 +- 22 files changed, 77 insertions(+), 80 deletions(-) create mode 100644 lib/util/server_id.c diff --git a/lib/util/server_id.c b/lib/util/server_id.c new file mode 100644 index 00000000000..a67c40eb193 --- /dev/null +++ b/lib/util/server_id.c @@ -0,0 +1,36 @@ +/* + Unix SMB/CIFS implementation. + Samba utility functions + Copyright (C) Andrew Bartlett 2011 + + 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 3 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, see . +*/ + +#include "includes.h" +#include "librpc/gen_ndr/server_id.h" + +char *server_id_str(TALLOC_CTX *mem_ctx, const struct server_id *id) +{ + if (id->vnn == NONCLUSTER_VNN && id->task_id == 0) { + return talloc_asprintf(mem_ctx, + "%llu", + (unsigned long long)id->pid); + } else { + return talloc_asprintf(mem_ctx, + "%u:%llu:%u", + (unsigned)id->vnn, + (unsigned long long)id->pid, + (unsigned)id->task_id); + } +} diff --git a/lib/util/util.h b/lib/util/util.h index e89c4ac9977..e50cc38a2f6 100644 --- a/lib/util/util.h +++ b/lib/util/util.h @@ -916,5 +916,7 @@ char *data_path(TALLOC_CTX *mem_ctx, const char *name); **/ const char *shlib_ext(void); +struct server_id; +char *server_id_str(TALLOC_CTX *mem_ctx, const struct server_id *id); #endif /* _SAMBA_UTIL_H_ */ diff --git a/lib/util/wscript_build b/lib/util/wscript_build index 8ce30eb6891..6c4bb37884d 100755 --- a/lib/util/wscript_build +++ b/lib/util/wscript_build @@ -5,7 +5,8 @@ common_util_sources = '''talloc_stack.c smb_threads.c xfile.c data_blob.c genrand.c fsusage.c blocking.c become_daemon.c signal.c system.c params.c util.c util_id.c util_net.c util_strlist.c util_paths.c idtree.c debug.c fault.c base64.c - util_str.c util_str_common.c substitute.c ms_fnmatch.c''' + util_str.c util_str_common.c substitute.c ms_fnmatch.c + server_id.c''' common_util_headers = 'debug.h' common_util_public_deps = 'talloc pthread LIBCRYPTO CHARSET' diff --git a/librpc/idl/server_id.idl b/librpc/idl/server_id.idl index 51900000edb..414e05a190f 100644 --- a/librpc/idl/server_id.idl +++ b/librpc/idl/server_id.idl @@ -4,6 +4,13 @@ interface server_id { + /* + * Virtual Node Numbers are identifying a node within a cluster. + * Ctdbd sets this, we retrieve our vnn from it. + */ + + const int NONCLUSTER_VNN = 0xFFFFFFFF; + /* used to look like the following, note that unique_id was not * marshalled at all... diff --git a/source3/Makefile.in b/source3/Makefile.in index 8165d2585c0..a06c8c7c098 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -429,7 +429,7 @@ UTIL_OBJ = ../lib/util/rbtree.o ../lib/util/signal.o ../lib/util/time.o \ ../lib/util/tevent_werror.o \ ../lib/util/smb_threads.o ../lib/util/util_id.o \ ../lib/util/blocking.o ../lib/util/rfc1738.o \ - ../lib/util/select.o ../lib/util/util_pw.o + ../lib/util/select.o ../lib/util/util_pw.o ../lib/util/server_id.o CRYPTO_OBJ = ../lib/crypto/crc32.o ../lib/crypto/md5.o \ ../lib/crypto/hmacmd5.o ../lib/crypto/arcfour.o \ diff --git a/source3/include/messages.h b/source3/include/messages.h index a78599055d2..41d5bb19fdb 100644 --- a/source3/include/messages.h +++ b/source3/include/messages.h @@ -48,13 +48,6 @@ #define FLAG_MSG_DBWRAP 0x0020 -/* - * Virtual Node Numbers are identifying a node within a cluster. Ctdbd sets - * this, we retrieve our vnn from it. - */ - -#define NONCLUSTER_VNN (0xFFFFFFFF) - /* * ctdb gives us 64-bit server ids for messaging_send. This is done to avoid * pid clashes and to be able to register for special messages like "all diff --git a/source3/include/proto.h b/source3/include/proto.h index c04dc94e204..42c62d2f6f1 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -594,7 +594,6 @@ bool cluster_id_equal(const struct server_id *id1, const struct server_id *id2); bool procid_is_me(const struct server_id *pid); struct server_id interpret_pid(const char *pid_string); -char *procid_str(TALLOC_CTX *mem_ctx, const struct server_id *pid); char *procid_str_static(const struct server_id *pid); bool procid_valid(const struct server_id *pid); bool procid_is_local(const struct server_id *pid); diff --git a/source3/lib/g_lock.c b/source3/lib/g_lock.c index f2452919af0..006ee3698cc 100644 --- a/source3/lib/g_lock.c +++ b/source3/lib/g_lock.c @@ -108,7 +108,7 @@ static bool g_lock_parse(TALLOC_CTX *mem_ctx, TDB_DATA data, DEBUG(10, ("locks:\n")); for (i=0; ivnn == NONCLUSTER_VNN && pid->task_id == 0) { - return talloc_asprintf(mem_ctx, - "%llu", - (unsigned long long)pid->pid); - } - else { - return talloc_asprintf(mem_ctx, - "%u:%llu:%u", - (unsigned)pid->vnn, - (unsigned long long)pid->pid, - (unsigned)pid->task_id); - } -} - char *procid_str_static(const struct server_id *pid) { - return procid_str(talloc_tos(), pid); + return server_id_str(talloc_tos(), pid); } bool procid_valid(const struct server_id *pid) diff --git a/source3/locking/brlock.c b/source3/locking/brlock.c index 52e23ec0037..ad0f9d5e526 100644 --- a/source3/locking/brlock.c +++ b/source3/locking/brlock.c @@ -51,7 +51,7 @@ static void print_lock_struct(unsigned int i, struct lock_struct *pls) i, (unsigned long long)pls->context.smblctx, (unsigned int)pls->context.tid, - procid_str(talloc_tos(), &pls->context.pid) )); + server_id_str(talloc_tos(), &pls->context.pid) )); DEBUG(10,("start = %.0f, size = %.0f, fnum = %d, %s %s\n", (double)pls->start, diff --git a/source3/smbd/oplock.c b/source3/smbd/oplock.c index 8482a00f641..56481e97000 100644 --- a/source3/smbd/oplock.c +++ b/source3/smbd/oplock.c @@ -459,7 +459,7 @@ void process_oplock_async_level2_break_message(struct messaging_context *msg_ctx message_to_share_mode_entry(&msg, (char *)data->data); DEBUG(10, ("Got oplock async level 2 break message from pid %s: " - "%s/%lu\n", procid_str(talloc_tos(), &src), + "%s/%lu\n", server_id_str(talloc_tos(), &src), file_id_string_tos(&msg.id), msg.share_file_id)); fsp = initial_break_processing(sconn, msg.id, msg.share_file_id); @@ -510,7 +510,7 @@ static void process_oplock_break_message(struct messaging_context *msg_ctx, message_to_share_mode_entry(&msg, (char *)data->data); DEBUG(10, ("Got oplock break message from pid %s: %s/%lu\n", - procid_str(talloc_tos(), &src), file_id_string_tos(&msg.id), + server_id_str(talloc_tos(), &src), file_id_string_tos(&msg.id), msg.share_file_id)); fsp = initial_break_processing(sconn, msg.id, msg.share_file_id); @@ -617,7 +617,7 @@ static void process_kernel_oplock_break(struct messaging_context *msg_ctx, file_id = (unsigned long)IVAL(data->data, 24); DEBUG(10, ("Got kernel oplock break message from pid %s: %s/%u\n", - procid_str(talloc_tos(), &src), file_id_string_tos(&id), + server_id_str(talloc_tos(), &src), file_id_string_tos(&id), (unsigned int)file_id)); fsp = initial_break_processing(sconn, id, file_id); @@ -704,7 +704,7 @@ static void process_oplock_break_response(struct messaging_context *msg_ctx, message_to_share_mode_entry(&msg, (char *)data->data); DEBUG(10, ("Got oplock break response from pid %s: %s/%lu mid %llu\n", - procid_str(talloc_tos(), &src), file_id_string_tos(&msg.id), + server_id_str(talloc_tos(), &src), file_id_string_tos(&msg.id), msg.share_file_id, (unsigned long long)msg.op_mid)); schedule_deferred_open_message_smb(msg.op_mid); @@ -732,7 +732,7 @@ static void process_open_retry_message(struct messaging_context *msg_ctx, message_to_share_mode_entry(&msg, (char *)data->data); DEBUG(10, ("Got open retry msg from pid %s: %s mid %llu\n", - procid_str(talloc_tos(), &src), file_id_string_tos(&msg.id), + server_id_str(talloc_tos(), &src), file_id_string_tos(&msg.id), (unsigned long long)msg.op_mid)); schedule_deferred_open_message_smb(msg.op_mid); diff --git a/source3/smbd/sesssetup.c b/source3/smbd/sesssetup.c index ee305c478e5..98bed880df8 100644 --- a/source3/smbd/sesssetup.c +++ b/source3/smbd/sesssetup.c @@ -1223,7 +1223,7 @@ static int shutdown_other_smbds(const struct connections_key *key, struct shutdown_state *state = (struct shutdown_state *)private_data; DEBUG(10, ("shutdown_other_smbds: %s, %s\n", - procid_str(talloc_tos(), &crec->pid), crec->addr)); + server_id_str(talloc_tos(), &crec->pid), crec->addr)); if (!process_exists(crec->pid)) { DEBUG(10, ("process does not exist\n")); diff --git a/source3/utils/net_g_lock.c b/source3/utils/net_g_lock.c index 6ed5d1776a6..bfb9a225abd 100644 --- a/source3/utils/net_g_lock.c +++ b/source3/utils/net_g_lock.c @@ -113,7 +113,7 @@ static int net_g_lock_dump_fn(struct server_id pid, enum g_lock_type lock_type, { char *pidstr; - pidstr = procid_str(talloc_tos(), &pid); + pidstr = server_id_str(talloc_tos(), &pid); d_printf("%s: %s (%s)\n", pidstr, (lock_type & 1) ? "WRITE" : "READ", (lock_type & G_LOCK_PENDING) ? "pending" : "holder"); diff --git a/source3/utils/net_serverid.c b/source3/utils/net_serverid.c index 08a1a7f298b..2c3320f40e1 100644 --- a/source3/utils/net_serverid.c +++ b/source3/utils/net_serverid.c @@ -26,7 +26,7 @@ static int net_serverid_list_fn(const struct server_id *id, uint32_t msg_flags, void *priv) { - char *str = procid_str(talloc_tos(), id); + char *str = server_id_str(talloc_tos(), id); d_printf("%s %llu 0x%x\n", str, (unsigned long long)id->unique_id, (unsigned int)msg_flags); TALLOC_FREE(str); @@ -51,7 +51,7 @@ static int net_serverid_wipe_fn(struct db_record *rec, } status = rec->delete_rec(rec); if (!NT_STATUS_IS_OK(status)) { - char *str = procid_str(talloc_tos(), id); + char *str = server_id_str(talloc_tos(), id); DEBUG(1, ("Could not delete serverid.tdb record %s: %s\n", str, nt_errstr(status))); TALLOC_FREE(str); @@ -75,13 +75,13 @@ static int net_serverid_wipedbs_conn( NTSTATUS status; DEBUG(10, ("Deleting connections.tdb record for pid %s\n", - procid_str(talloc_tos(), &key->pid))); + server_id_str(talloc_tos(), &key->pid))); status = rec->delete_rec(rec); if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("Could not delete connections.tdb record " "for pid %s: %s\n", - procid_str(talloc_tos(), &key->pid), + server_id_str(talloc_tos(), &key->pid), nt_errstr(status))); } } @@ -97,13 +97,13 @@ static int net_serverid_wipedbs_sessionid(struct db_record *rec, NTSTATUS status; DEBUG(10, ("Deleting sessionid.tdb record for pid %s\n", - procid_str(talloc_tos(), &session->pid))); + server_id_str(talloc_tos(), &session->pid))); status = rec->delete_rec(rec); if (!NT_STATUS_IS_OK(status)) { DEBUG(1, ("Could not delete session.tdb record " "for pid %s: %s\n", - procid_str(talloc_tos(), &session->pid), + server_id_str(talloc_tos(), &session->pid), nt_errstr(status))); } } diff --git a/source3/utils/smbcontrol.c b/source3/utils/smbcontrol.c index 5bf5c5da7b4..0a3a94a1df0 100644 --- a/source3/utils/smbcontrol.c +++ b/source3/utils/smbcontrol.c @@ -119,7 +119,7 @@ static void print_pid_string_cb(struct messaging_context *msg, { char *pidstr; - pidstr = procid_str(talloc_tos(), &pid); + pidstr = server_id_str(talloc_tos(), &pid); printf("PID %s: %.*s", pidstr, (int)data->length, (const char *)data->data); TALLOC_FREE(pidstr); @@ -433,7 +433,7 @@ static void pong_cb(struct messaging_context *msg, struct server_id pid, DATA_BLOB *data) { - char *src_string = procid_str(NULL, &pid); + char *src_string = server_id_str(NULL, &pid); printf("PONG from pid %s\n", src_string); TALLOC_FREE(src_string); num_replies++; @@ -1143,7 +1143,7 @@ static void winbind_validate_cache_cb(struct messaging_context *msg, struct server_id pid, DATA_BLOB *data) { - char *src_string = procid_str(NULL, &pid); + char *src_string = server_id_str(NULL, &pid); printf("Winbindd cache is %svalid. (answer from pid %s)\n", (*(data->data) == 0 ? "" : "NOT "), src_string); TALLOC_FREE(src_string); diff --git a/source4/cluster/cluster.c b/source4/cluster/cluster.c index 767e6a719f0..757489ebce6 100644 --- a/source4/cluster/cluster.c +++ b/source4/cluster/cluster.c @@ -56,17 +56,6 @@ struct server_id cluster_id(uint64_t pid, uint32_t task_id) return ops->cluster_id(ops, pid, task_id); } - -/* - return a server_id as a string -*/ -char *cluster_id_string(TALLOC_CTX *mem_ctx, struct server_id id) -{ - cluster_init(); - return ops->cluster_id_string(ops, mem_ctx, id); -} - - /* open a temporary tdb in a cluster friendly manner */ diff --git a/source4/cluster/cluster.h b/source4/cluster/cluster.h index a6f74f956c9..3dd9f4ce7c5 100644 --- a/source4/cluster/cluster.h +++ b/source4/cluster/cluster.h @@ -41,7 +41,6 @@ typedef void (*cluster_message_fn_t)(struct imessaging_context *, DATA_BLOB); /* prototypes */ struct server_id cluster_id(uint64_t id, uint32_t task_id); -char *cluster_id_string(TALLOC_CTX *mem_ctx, struct server_id id); struct tdb_wrap *cluster_tdb_tmp_open(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx, const char *dbname, int flags); void *cluster_backend_handle(void); diff --git a/source4/cluster/cluster_private.h b/source4/cluster/cluster_private.h index 5f038dd92fc..6f68ad62bd7 100644 --- a/source4/cluster/cluster_private.h +++ b/source4/cluster/cluster_private.h @@ -24,8 +24,6 @@ struct cluster_ops { struct server_id (*cluster_id)(struct cluster_ops *ops, uint64_t id, uint32_t id2); - char *(*cluster_id_string)(struct cluster_ops *ops, - TALLOC_CTX *, struct server_id ); struct tdb_wrap *(*cluster_tdb_tmp_open)(struct cluster_ops *, TALLOC_CTX *, struct loadparm_context *, diff --git a/source4/cluster/local.c b/source4/cluster/local.c index e7b648fc9be..833a86b07fb 100644 --- a/source4/cluster/local.c +++ b/source4/cluster/local.c @@ -41,16 +41,6 @@ static struct server_id local_id(struct cluster_ops *ops, uint64_t pid, uint32_t } -/* - return a server_id as a string -*/ -static char *local_id_string(struct cluster_ops *ops, - TALLOC_CTX *mem_ctx, struct server_id id) -{ - return talloc_asprintf(mem_ctx, "%u.%llu.%u", id.vnn, (unsigned long long)id.pid, id.task_id); -} - - /* open a tmp tdb for the local node. By using smbd_tmp_path() we don't need TDB_CLEAR_IF_FIRST as the tmp path is wiped at startup @@ -98,7 +88,6 @@ static NTSTATUS local_message_send(struct cluster_ops *ops, static struct cluster_ops cluster_local_ops = { .cluster_id = local_id, - .cluster_id_string = local_id_string, .cluster_tdb_tmp_open = local_tdb_tmp_open, .backend_handle = local_backend_handle, .message_init = local_message_init, diff --git a/source4/lib/messaging/messaging.c b/source4/lib/messaging/messaging.c index 3a330d5794f..aa1b43308f4 100644 --- a/source4/lib/messaging/messaging.c +++ b/source4/lib/messaging/messaging.c @@ -109,7 +109,7 @@ static void irpc_handler(struct imessaging_context *, void *, static void ping_message(struct imessaging_context *msg, void *private_data, uint32_t msg_type, struct server_id src, DATA_BLOB *data) { - char *task_id = cluster_id_string(NULL, src); + char *task_id = server_id_str(NULL, &src); DEBUG(1,("INFO: Received PING message from server %s [%.*s]\n", task_id, (int)data->length, data->data?(const char *)data->data:"")); @@ -134,7 +134,7 @@ static NTSTATUS irpc_uptime(struct irpc_message *msg, static char *imessaging_path(struct imessaging_context *msg, struct server_id server_id) { TALLOC_CTX *tmp_ctx = talloc_new(msg); - const char *id = cluster_id_string(tmp_ctx, server_id); + const char *id = server_id_str(tmp_ctx, &server_id); char *s; if (id == NULL) { return NULL; @@ -284,8 +284,8 @@ static void imessaging_send_handler(struct imessaging_context *msg) if (!NT_STATUS_IS_OK(status)) { TALLOC_CTX *tmp_ctx = talloc_new(msg); DEBUG(1,("messaging: Lost message from %s to %s of type %u - %s\n", - cluster_id_string(tmp_ctx, rec->header->from), - cluster_id_string(tmp_ctx, rec->header->to), + server_id_str(tmp_ctx, &rec->header->from), + server_id_str(tmp_ctx, &rec->header->to), rec->header->msg_type, nt_errstr(status))); talloc_free(tmp_ctx); diff --git a/source4/smb_server/smb/receive.c b/source4/smb_server/smb/receive.c index 1e5d5681f46..1379fe31cf5 100644 --- a/source4/smb_server/smb/receive.c +++ b/source4/smb_server/smb/receive.c @@ -502,7 +502,7 @@ static void switch_message(int type, struct smbsrv_request *req) } } - task_id = cluster_id_string(NULL, req->smb_conn->connection->server_id); + task_id = server_id_str(NULL, &req->smb_conn->connection->server_id); DEBUG(5,("switch message %s (task_id %s)\n", smb_fn_name(type), task_id)); talloc_free(task_id); diff --git a/source4/smbd/service_stream.c b/source4/smbd/service_stream.c index efbcfb490a2..6e65122063b 100644 --- a/source4/smbd/service_stream.c +++ b/source4/smbd/service_stream.c @@ -217,7 +217,7 @@ static void stream_new_connection(struct tevent_context *ev, stream_socket->ops->name, tsocket_address_string(srv_conn->remote_address, tmp_ctx), tsocket_address_string(srv_conn->local_address, tmp_ctx), - cluster_id_string(tmp_ctx, server_id)); + server_id_str(tmp_ctx, &server_id)); if (title) { stream_connection_set_title(srv_conn, title); } -- 2.34.1