1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
/* 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);
|