From: Axel Burri <axel@tty0.ch>
To: linux-btrfs@vger.kernel.org
Cc: Axel Burri <axel@tty0.ch>
Subject: [RFC PATCH 1/6] btrfs-progs: splitcmd-gen.sh: create btrfs-<subcommand> binaries for selected subcommands
Date: Wed, 29 Aug 2018 19:24:04 +0200 [thread overview]
Message-ID: <20180829172409.18064-2-axel@tty0.ch> (raw)
In-Reply-To: <20180829172409.18064-1-axel@tty0.ch>
Create separate binaries for each subcommand ("btrfs foo bar").
Least invasive approach, generate c-files for each command:
# ./splitcmd-gen.sh
# make V=1 btrfs-subvolume-show
# make V=1 btrfs-send
# [...]
Alternative approach: instead of including the c-file, link with obj
in Makefile, e.g.:
btrfs_subvolume_show_objects = cmds-subvolume.o
btrfs_send_objects = cmds-send.o
[...]
This implies adaptions in cmds-subvolume.c (and others):
-static int cmd_filesystem_show(int argc, char **argv)
+int cmd_filesystem_show(int argc, char **argv)
If they are defined non-static, we could probably simplify further and
add `-Wl,-eentry` flags (changing entry point from "main" to "entry").
With this, and if handle_command_group() was declared in some library
instead of btrfs.c, we would get rid of generated files completely.
Signed-off-by: Axel Burri <axel@tty0.ch>
---
splitcmd-gen.sh | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
splitcmd.c.in | 17 ++++++++++++++
2 files changed, 87 insertions(+)
create mode 100755 splitcmd-gen.sh
create mode 100644 splitcmd.c.in
diff --git a/splitcmd-gen.sh b/splitcmd-gen.sh
new file mode 100755
index 00000000..4d2e0509
--- /dev/null
+++ b/splitcmd-gen.sh
@@ -0,0 +1,70 @@
+#!/bin/bash
+
+#
+# Generate c-files for btrfs subcommands defined below
+#
+
+# Notes on linux capabilities:
+#
+# btrfs-subvolume-show, btrfs-subvolume-list, btrfs-send:
+# - CAP_FOWNER is only needed for O_NOATIME flag in open() system calls
+# - why CAP_SYS_ADMIN? shouldn't CAP_DAC_READ_SEARCH be enough?
+#
+# btrfs-receive:
+# - dependent on send-stream (see cmds-receive.c: "send_ops"):
+# CAP_CHOWN, CAP_MKNOD, CAP_SETFCAP (for "lsetxattr")
+#
+# btrfs-filesystem-usage:
+# - CAP_SYS_ADMIN is for BTRFS_IOC_TREE_SEARCH and BTRFS_IOC_FS_INFO
+# in order to provide full level of detail, see btrfs-filesystem(8)
+
+
+makefile_out="Makefile.install_setcap"
+
+splitcmd_list=""
+setcap_lines=""
+
+function gen_splitcmd {
+ local name="$1"
+ local dest="${1}.c"
+ local cfile="$2"
+ local entry="$3"
+ local caps="$4"
+ echo "generating: ${dest} (cfile=${cfile}, entry=${entry})"
+ echo -e "/*\n * ${name}\n *\n * GENERATED BY splitcmd-gen.sh\n */\n" > $dest
+ sed -e "s|@BTRFS_SPLITCMD_CFILE_INCLUDE@|${cfile}|g" \
+ -e "s|@BTRFS_SPLITCMD_ENTRY@|${entry}|g" \
+ splitcmd.c.in >> $dest
+}
+
+gen_splitcmd "btrfs-subvolume-show" \
+ "cmds-subvolume.c" "cmd_subvol_show" \
+ "cap_sys_admin,cap_fowner,cap_dac_read_search"
+
+gen_splitcmd "btrfs-subvolume-list" \
+ "cmds-subvolume.c" "cmd_subvol_list" \
+ "cap_sys_admin,cap_fowner,cap_dac_read_search"
+
+gen_splitcmd "btrfs-subvolume-snapshot" \
+ "cmds-subvolume.c" "cmd_subvol_snapshot" \
+ "cap_sys_admin,cap_fowner,cap_dac_override,cap_dac_read_search"
+
+gen_splitcmd "btrfs-subvolume-delete" \
+ "cmds-subvolume.c" "cmd_subvol_delete" \
+ "cap_sys_admin,cap_dac_override"
+
+gen_splitcmd "btrfs-send" \
+ "cmds-send.c" "cmd_send" \
+ "cap_sys_admin,cap_fowner,cap_dac_read_search"
+
+gen_splitcmd "btrfs-receive" \
+ "cmds-receive.c" "cmd_receive" \
+ "cap_sys_admin,cap_fowner,cap_chown,cap_mknod,cap_setfcap,cap_dac_override,cap_dac_read_search"
+
+gen_splitcmd "btrfs-filesystem-usage" \
+ "cmds-fi-usage.c" "cmd_filesystem_usage" \
+ "cap_sys_admin"
+
+gen_splitcmd "btrfs-qgroup-destroy" \
+ "cmds-qgroup.c" "cmd_qgroup_destroy" \
+ "cap_sys_admin,cap_dac_override"
diff --git a/splitcmd.c.in b/splitcmd.c.in
new file mode 100644
index 00000000..aa07af9a
--- /dev/null
+++ b/splitcmd.c.in
@@ -0,0 +1,17 @@
+#include "@BTRFS_SPLITCMD_CFILE_INCLUDE@"
+
+/*
+ * Dummy object: used from second-level command groups (e.g. in
+ * "cmds-subvolume.c"), is never called in splitcmd executables.
+ */
+int handle_command_group(const struct cmd_group *grp, int argc,
+ char **argv)
+{
+ exit(1);
+}
+
+
+int main(int argc, char **argv)
+{
+ return @BTRFS_SPLITCMD_ENTRY@(argc, argv);
+}
--
2.16.4
next prev parent reply other threads:[~2018-08-29 21:29 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-08-29 17:24 [RFC PATCH 0/6] btrfs-progs: build distinct binaries for specific btrfs subcommands Axel Burri
2018-08-29 17:24 ` Axel Burri [this message]
2018-08-30 2:38 ` [RFC PATCH 1/6] btrfs-progs: splitcmd-gen.sh: create btrfs-<subcommand> binaries for selected subcommands Misono Tomohiro
2018-08-29 17:24 ` [RFC PATCH 2/6] btrfs-progs: add btrfs-<subcommand> source files generated by splitcmd-gen.sh Axel Burri
2018-08-29 17:24 ` [RFC PATCH 3/6] btrfs-progs: Makefile: add "install-splitcmd-setcap" target, installs splitcmd binaries with appropriate capabilities Axel Burri
2018-08-29 17:24 ` [RFC PATCH 4/6] btrfs-progs: Makefile: include Makefile.install_setcap generated by splitcmd-gen.sh Axel Burri
2018-08-29 17:24 ` [RFC PATCH 5/6] btrfs-progs: Makefile: move progs_splitcmd variable to Makefile.install_setcap Axel Burri
2018-08-29 17:24 ` [RFC PATCH 6/6] btrfs-progs: add splitcmd binaries to gitignore Axel Burri
2018-08-29 19:02 ` [RFC PATCH 0/6] btrfs-progs: build distinct binaries for specific btrfs subcommands Austin S. Hemmelgarn
2018-08-30 17:13 ` Axel Burri
2018-08-30 17:23 ` Austin S. Hemmelgarn
2018-09-12 14:58 ` Axel Burri
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180829172409.18064-2-axel@tty0.ch \
--to=axel@tty0.ch \
--cc=linux-btrfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).