/* SPDX-License-Identifier: GPL-2.0 */ /** \file command.h The structure of server and afs commands. */ /** Per connection data available to command handlers. */ struct command_context { /** The permanent socket connecting the server and the afs process. */ int afs_fd; /** The paraslash user that executes this command. */ const struct user *u; /** File descriptor and crypto keys. */ struct stream_cipher_context scc; }; /** Prototype of a server command handler. */ typedef int (*server_cmd_handler_t)(struct command_context *, struct lls_parse_result *); /** * The lopsub user data structure for server commands. * * One such structure exists for each server command. Lopsub maintains * references to the user data structures and provides lls_user_data() for * applications to fetch the user data pointer of a given command. This * mechanism is used by the dispatcher of command.c to run the command handler. */ struct server_cmd_user_data { /** Pointer to the command handler. */ server_cmd_handler_t handler; }; /** \cond doxygen_ignore Define the user data structure for one command. */ #define EXPORT_SERVER_CMD_HANDLER(_cmd) \ const struct server_cmd_user_data lsg_server_cmd_com_ ## _cmd ## _user_data = { \ .handler = com_ ## _cmd \ }; /* Get the lopsub command pointer by command name. */ #define SERVER_CMD_CMD_PTR(_cmd) \ (lls_cmd(LSG_SERVER_CMD_CMD_ ## _cmd, server_cmd_suite)) /* Get the lopsub parse result of an option. */ #define SERVER_CMD_OPT_RESULT(_cmd, _opt, _lpr) \ (lls_opt_result(LSG_SERVER_CMD_ ## _cmd ## _OPT_ ## _opt, _lpr)) /* How many times an option was given. */ #define SERVER_CMD_OPT_GIVEN(_cmd, _opt, _lpr) \ (lls_opt_given(SERVER_CMD_OPT_RESULT(_cmd, _opt, _lpr))) /* Fetch the (first) argument given to an option of type uint32. */ #define SERVER_CMD_UINT32_VAL(_cmd, _opt, _lpr) \ (lls_uint32_val(0, SERVER_CMD_OPT_RESULT(_cmd, _opt, _lpr))) /** \endcond */ int send_sb(struct stream_cipher_context *scc, void *buf, size_t numbytes, int band, bool dont_free); __printf_3_4 int send_sb_va(struct stream_cipher_context *scc, int band, const char *fmt, ...); int send_strerror(struct command_context *cc, int err); int send_errctx(struct command_context *cc, char *errctx); int recv_sb(struct stream_cipher_context *scc, enum sb_designator expected_band, size_t max_size, struct iovec *result);