summaryrefslogtreecommitdiff
path: root/command.h
blob: 1095754ed15715db6a40687fcade41367118d20f (plain)
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);