X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=server.h;h=da75d86bdf191b130d02da12f49172ac5e0482d7;hp=a83aaae29aa59362f9665c08c1abcb899cbfdb6c;hb=3685a9093ae12ff9ce02fc58e607eb9b63894443;hpb=fa2e4b062432412b90ad7ba6e85d27764544f1c8 diff --git a/server.h b/server.h index a83aaae2..da75d86b 100644 --- a/server.h +++ b/server.h @@ -1,110 +1,116 @@ -/* - * Copyright (C) 1997-2007 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ - -/** \file server.h common server data structures */ +/* Copyright (C) 1997 Andre Noll , see file COPYING. */ +/** \file server.h Common server data structures. */ -/** size of the selector_info and audio_file info strings of struct misc_meta_data */ +/** Size of the selector_info and audio_file info strings of struct misc_meta_data. */ #define MMD_INFO_SIZE 16384 -/** - * defines one command of para_server - */ -struct server_command { -/** the name of the command */ - const char *name; -/** pointer to the function that handles the command */ - int (*handler)(int, int, char * const * const); -/** the privileges a user must have to execute this command */ - unsigned int perms; -/** one-line description of the command */ - const char *description; -/** summary of the command line options */ - const char *usage; -/** the long help text */ - const char *help; -}; - -/** holds the arguments for the para_server's sender command */ -struct sender_command_data{ -/** greater than 0 indicates that a sender cmd is already queued */ +/** Arguments for the sender command. */ +struct sender_command_data { + /** Greater than zero indicates that a sender cmd is already queued. */ int cmd_num; -/** the number of the sender in question */ + /** The number of the sender in question. */ int sender_num; -/** used for the allow/deny/add/remove subcommands */ - struct in_addr addr; -/** used for allow/deny */ + /** Used for the allow/deny/add/remove subcommands. */ + char host[MAX_HOSTLEN]; + /** Used for allow/deny. */ int netmask; -/** the portnumber for add/remove */ + /** The port number for add/remove. */ int port; + /** Maximal slice size. */ + uint16_t max_slice_bytes; + /** Number of data slices plus redundant slices. */ + uint8_t slices_per_group; + /** Number of slices minus number of redundant slices. */ + uint8_t data_slices_per_group; }; /** - * Used for parent-child communication. - * - * There's only one struct of this type which lives in shared memory - * for communication between the server instances. Access to this - * area is serialized via mmd_lock() and mmd_unlock(). There are two - * reasons for a variable to be included here: + * Miscellaneous data for communication between server and command handlers. * - * - At least one command (i.e. child of the server) must be able to - * change its value. + * There's only one instance of this structure which lives in a shared memory + * area. Command handlers communicate with the server process through this + * area. Changes made by the command handlers stay after the command handler + * exits. Conversely, changes made by the server process propagate to the + * command handlers. Access to this area is serialized via mmd_lock() and + * mmd_unlock(). * - * or - * - * - The contents are listed in the stat command and have to be up to - * date. + * There are two reasons for a variable to be included here: (a) at least one + * command handler changes its value, or (b) updates by the server must + * propagate to the stat command handlers. */ struct misc_meta_data { - /** the size of the current audio file in bytes */ - size_t size; - /** the last modification time of the current audio file */ - time_t mtime; - /** the "old" status flags -- commands may only read them */ + /** The "old" status flags -- commands may only read them. */ unsigned int vss_status_flags; /** The new status flags -- commands may set them. */ unsigned int new_vss_status_flags; - /** the number of data chunks sent for the current audio file */ + /** The number of data chunks sent so far. */ long unsigned chunks_sent; - /** set by the jmp/ff commands to the new position in chunks */ + /** Set by the jmp/ff commands to the new position in chunks. */ long unsigned repos_request; - /** The number of the chunk currently sent out. */ + /** The number of the chunk currently being sent. */ long unsigned current_chunk; - /** the milliseconds that have been skipped of the current audio file */ + /** The milliseconds that have been skipped of the current audio file. */ long offset; - /** the time para_server started to stream */ + /** The time para_server started to stream. */ struct timeval stream_start; /** * The event counter. * - * Commands may increase this to force a status update to be sent to all - * connected clients. + * Commands may increase this to force a status update to be sent to + * all connected stat clients. */ unsigned int events; - /** the number of audio files already sent */ + /** The number of audio files already sent. */ unsigned int num_played; - /** the number of executed commands */ + /** The number of executed commands. */ unsigned int num_commands; - /** the number of connections para_server received so far */ + /** The number of connections para_server received so far. */ unsigned int num_connects; - /** the number of connections currently active */ + /** The number of connections currently active. */ unsigned int active_connections; - /** the process id of para_server */ - pid_t server_pid; /** This gets updated by afs and contains its current mode. */ char afs_mode_string[MAXLINE]; - /** used by the sender command */ + /** Used by the sender command. */ struct sender_command_data sender_cmd_data; /** Describes the current audio file. */ struct audio_file_data afd; }; -extern struct server_args_info conf; -extern int afs_socket; +extern pid_t afs_pid; +extern struct lls_parse_result *server_lpr; + +/** + * Get a reference to the supercommand of para_server. + * + * This is needed for parsing the command line and for the ENUM_STRING_VAL() + * macro below. The latter macro is used in command.c, so CMD_PTR() can not + * be made local to server.c. + */ +#define CMD_PTR (lls_cmd(0, server_suite)) + +/** Get the parse result of an option to para_server. */ +#define OPT_RESULT(_name) (lls_opt_result( \ + LSG_SERVER_PARA_SERVER_OPT_ ## _name, server_lpr)) + +/** How many times a server option was given. */ +#define OPT_GIVEN(_name) (lls_opt_given(OPT_RESULT(_name))) + +/** The (first) argument to a server option of type string. */ +#define OPT_STRING_VAL(_name) (lls_string_val(0, OPT_RESULT(_name))) + +/** The (first) argument to a server option of type uint32. */ +#define OPT_UINT32_VAL(_name) (lls_uint32_val(0, OPT_RESULT(_name))) + +/** The (first) argument to a server option of type int32. */ +#define OPT_INT32_VAL(_name) (lls_int32_val(0, OPT_RESULT(_name))) + +/** Get the string which corresponds to an enum constant. */ +#define ENUM_STRING_VAL(_name) (lls_enum_string_val(OPT_UINT32_VAL(_name), \ + lls_opt(LSG_SERVER_PARA_SERVER_OPT_ ## _name, CMD_PTR))) -int handle_connect(int fd, struct sockaddr_in *addr); -void mmd_unlock(void); -void mmd_lock(void); +int handle_connect(int fd); +void parse_config_or_die(bool reload); +char *server_get_tasks(void); +bool process_is_command_handler(void); +void free_lpr(void);