X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=command.h;h=a7fa4673c696fe52f79bcb17dd4ca2a10ae720f9;hp=5e1a4ce3edc1a8812948ada45eecd2f76df4f7be;hb=ac1f19d550a81c8408c8fce2e237996c950253ab;hpb=6e0b28e02a1013c019a3225e922b71f913bfbae4 diff --git a/command.h b/command.h index 5e1a4ce3..a7fa4673 100644 --- a/command.h +++ b/command.h @@ -2,23 +2,57 @@ /** Per connection data available to command handlers. */ struct command_context { - /** Network address of the peer. */ - const char *peer; /** The paraslash user that executes this command. */ - struct user *u; - /** Argument count. */ - int argc; - /** Argument vector. */ - char **argv; + 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; +}; + +/** 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))) + 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);