/* * Copyright (C) 1997-2009 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ /** \file server.h Common server data structures. */ /** Size of the selector_info and audio_file info strings of struct misc_meta_data. */ #define MMD_INFO_SIZE 16384 /** The maximum length of the host component in an URL */ #define MAX_HOSTLEN 256 /** * 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. */ int cmd_num; /** The number of the sender in question. */ int sender_num; /** Used for the allow/deny/add/remove subcommands. */ char host[MAX_HOSTLEN]; /** Used for allow/deny. */ int netmask; /** 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: * * - At least one command (i.e. child of the server) must be able to * change its value. * * or * * - The contents are listed in the stat command and have to be up to * date. */ 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. */ 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. */ long unsigned chunks_sent; /** Set by the jmp/ff commands to the new position in chunks. */ long unsigned repos_request; /** The number of the chunk currently sent out. */ long unsigned current_chunk; /** The milliseconds that have been skipped of the current audio file. */ long offset; /** 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. */ unsigned int events; /** The number of audio files already sent. */ unsigned int num_played; /** The number of executed commands. */ unsigned int num_commands; /** The number of connections para_server received so far. */ unsigned int num_connects; /** The number of connections currently active. */ unsigned int active_connections; /** The process id of the audio file selector. */ pid_t afs_pid; /** This gets updated by afs and contains its current mode. */ char afs_mode_string[MAXLINE]; /** Used by the sender command. */ struct sender_command_data sender_cmd_data; /** Describes the current audio file. */ struct audio_file_data afd; }; /** Command line options for para_server. */ extern struct server_args_info conf; __noreturn void handle_connect(int fd, const char *peername); void parse_config_or_die(int override);