From: Jule Anger Date: Thu, 31 Mar 2022 08:31:31 +0000 (+0200) Subject: smbstatus: add locks to byte-range locked files in json output X-Git-Tag: samba-4.17.0rc1~12 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c47d9d28f122821bc316725804de498c3fee3806;p=thirdparty%2Fsamba.git smbstatus: add locks to byte-range locked files in json output At the moment, there is only information about the byte-range locked files. Adds a list of its locks for each file. An open is represented as a dictionary. Contains all information (pid, dev_inode, read_write, start and size) about the lock. Signed-off-by: Jule Anger Reviewed-by: Ralph Boehme --- diff --git a/source3/utils/status.c b/source3/utils/status.c index 97e4f71cc7d..f02e8e14951 100644 --- a/source3/utils/status.c +++ b/source3/utils/status.c @@ -412,6 +412,10 @@ static void print_brl(struct file_id id, } else { print_brl_json(state, pid, + desc, + lock_flav, + (intmax_t)start, + (intmax_t)size, sharepath, fname); diff --git a/source3/utils/status_json.c b/source3/utils/status_json.c index 30b12c46fed..71783916004 100644 --- a/source3/utils/status_json.c +++ b/source3/utils/status_json.c @@ -965,8 +965,80 @@ failure: return -1; } +static int add_lock_to_json(struct json_object *parent_json, + struct server_id server_id, + const char *type, + enum brl_flavour flavour, + intmax_t start, + intmax_t size) +{ + struct json_object sub_json; + struct json_object locks_json; + const char *flavour_str; + int result = 0; + + TALLOC_CTX *tmp_ctx = talloc_stackframe(); + if (tmp_ctx == NULL) { + return -1; + } + + locks_json = json_get_array(parent_json, "locks"); + if (json_is_invalid(&locks_json)) { + goto failure; + } + sub_json = json_new_object(); + if (json_is_invalid(&sub_json)) { + goto failure; + } + + result = add_server_id_to_json(&sub_json, server_id); + if (result < 0) { + goto failure; + } + result = json_add_string(&sub_json, "type", type); + if (result < 0) { + goto failure; + } + flavour_str = talloc_asprintf(tmp_ctx, "%s%s", + (flavour == WINDOWS_LOCK)?"Windows":"", + (flavour == POSIX_LOCK)?"Posix":""); + result = json_add_string(&sub_json, "flavour", flavour_str); + if (result < 0) { + goto failure; + } + result = json_add_int(&sub_json, "start", start); + if (result < 0) { + goto failure; + } + result = json_add_int(&sub_json, "size", size); + if (result < 0) { + goto failure; + } + + result = json_add_object(&locks_json, NULL, &sub_json); + if (result < 0) { + goto failure; + } + result = json_update_object(parent_json, "locks", &locks_json); + if (result < 0) { + goto failure; + } + + TALLOC_FREE(tmp_ctx); + return 0; +failure: + json_free(&locks_json); + json_free(&sub_json); + TALLOC_FREE(tmp_ctx); + return -1; +} + int print_brl_json(struct traverse_state *state, const struct server_id server_id, + const char *type, + enum brl_flavour flavour, + intmax_t start, + intmax_t size, const char *sharepath, const char *filename) { @@ -1010,6 +1082,10 @@ int print_brl_json(struct traverse_state *state, if (result < 0) { goto failure; } + result = add_lock_to_json(&file_json, server_id, type, flavour, start, size); + if (result < 0) { + goto failure; + } result = json_add_object(&brl_json, key, &file_json); if (result < 0) { diff --git a/source3/utils/status_json.h b/source3/utils/status_json.h index 04b44678db4..61e7b6a0540 100644 --- a/source3/utils/status_json.h +++ b/source3/utils/status_json.h @@ -55,6 +55,10 @@ int print_share_mode_json(struct traverse_state *state, int print_brl_json(struct traverse_state *state, const struct server_id server_id, + const char *type, + enum brl_flavour flavour, + intmax_t start, + intmax_t size, const char *sharepath, const char *filename); diff --git a/source3/utils/status_json_dummy.c b/source3/utils/status_json_dummy.c index 9a2ccc3db82..c657e55b44f 100644 --- a/source3/utils/status_json_dummy.c +++ b/source3/utils/status_json_dummy.c @@ -72,6 +72,10 @@ int print_share_mode_json(struct traverse_state *state, int print_brl_json(struct traverse_state *state, const struct server_id server_id, + const char *type, + enum brl_flavour flavour, + intmax_t start, + intmax_t size, const char *sharepath, const char *filename) {