/* * Copyright (C) 1997-2007 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ /** \file server.h common server data structures */ #include "para.h" #include "afh.h" /** 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 **); /** 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 */ struct in_addr addr; /** used for allow/deny */ int netmask; /** the portnumber for add/remove */ int port; }; /** * 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 { /** information on the current audio file */ struct audio_format_info afi; /** the size of the current audio file in bytes */ size_t size; /** the full path of the current audio file */ char filename[_POSIX_PATH_MAX]; /** the last modification file of the current audio file */ time_t mtime; /** the number of the current audio format */ int audio_format; /** 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 para_server */ pid_t server_pid; /** a string that gets filled in by the current audio file selector */ char selector_info[MMD_INFO_SIZE]; /** the number if the current audio file selector */ int selector_num; /** commands set this to non-zero to change the current selector */ int selector_change; /** used by the sender command */ struct sender_command_data sender_cmd_data; }; extern struct server_args_info conf; int handle_connect(int fd, struct sockaddr_in *addr); void mmd_unlock(void); void mmd_lock(void);