Cooking since 2014-09-22.
* t/sound_device_lock:
oss: Avoid sound artefacts on some setups.
oss: Introduce sound device lock.
audiod: Invalidate current audio format on close.
0.5.4 (to be announced) "exponential alignment"
-----------------------------------------------
- * Minor cleanups to daemon.c.
- * New URLs for home page and git services.
- * Improved error diagnostics for the mvblob commands.
+ - Minor cleanups to daemon.c.
+ - New URLs for home page and git services.
+ - Improved error diagnostics for the mvblob commands.
+ - New sender subcommand: status.
+ - Improved help text for server and afs commands.
+ - audiod memory leak fixes.
+ - oss_writer improvements.
Download: ./releases/paraslash-git.tar.bz2
uint16_t bitrate;
};
+/** Data about the current audio file, passed from afs to server. */
+struct audio_file_data {
+ /** The open file descriptor to the current audio file. */
+ int fd;
+ /** Vss needs this for streaming. */
+ struct afh_info afhi;
+ /** Size of the largest chunk. */
+ uint32_t max_chunk_size;
+ /** Needed to get the audio file header. */
+ uint8_t audio_format_id;
+};
+
/**
* Structure for audio format handling.
*
---
N: add
P: AFS_READ | AFS_WRITE
-D: Add new audio files to the database.
-U: add [-l] [-f] [-v] path...
-H: Each given path may be either the full path to an audio
-H: file, or the full path of a directory. In case of a
-H: directory, all audio files in that directory are added
-H: recursively. Only absolute paths are accepted.
+D: Add or update audio files.
+U: add [-a] [-l] [-f] [-v] path...
+H: Each path must be absolute and refer to either an audio file, or a
+H: directory. In case of a directory, all audio files in that directory
+H: are added recursively. Only absolute paths are accepted.
H:
H: Options:
H:
H: known suffix for a supported audio format.
H:
H: -l Add files lazily. If the path already exists in the
-H: database, skip this file. This operation is really cheap.
-H: Use it when adding large directories if only a few files
-H: where added.
+H: database, skip this file. This operation is really cheap. Useful
+H: to update large directories after some files have been added or
+H: deleted.
H:
H: -f Force adding/updating. Recompute the audio format handler data
H: even if a file with the same path and the same hash value exists.
H: -lm: mbox listing mode
H: -lc: chunk-table listing mode
H:
-H: -p List full path of audio file. If not specified, only the basename
+H: -p List full paths. If this option is not specified, only the basename
H: of each file is printed.
H:
H: -a List only files that are admissible with respect to the current mood or
P: AFS_READ
D: List attributes.
U: lsatt [-i] [-l] [-r] [pattern]
-H: Print the list of all defined attributes which match the
-H: given pattern. If no pattern is given, the full list is
-H: printed.
+H: Print the list of all defined attributes which match the given
+H: pattern. If no pattern is given, the full list is printed.
H:
H: Options:
H:
H: Set ('+') or unset ('-') the given attributes for all audio files matching
H: pattern. Example:
H:
-H: setatt rock+ punk+ classic- '*foo.mp3'
+H: setatt rock+ punk+ pop- '*foo.mp3'
H:
-H: sets the 'rock' and the 'punk' attribute but unsets the 'classic'
+H: sets the 'rock' and the 'punk' attribute and unsets the 'pop'
H: attribute of all files ending with 'foo.mp3'.
---
N: addatt
P: AFS_READ | AFS_WRITE
D: Remove entries from the audio file table.
U: rm [-v] [-f] [-p] pattern...
-H: Delete all entries in the audio file table that match any given pattern.
-H: Note that affects the table entries only; paraslash won't touch your
-H: audio files in any way.
+H: Delete all entries in the audio file table that match any given pattern. Note
+H: that this affects the table entries only; the command won't touch your audio
+H: files on disk.
+H:
H: Options:
H:
H: -v Verbose mode. Explain what is being done.
---
N: touch
P: AFS_READ | AFS_WRITE
-D: Manipulate the afs data for all audio files matching a pattern.
+D: Manipulate the afs entry of audio files.
U: touch [-n=numplayed] [-l=lastplayed] [-y=lyrics_id] [-i=image_id] [-a=amp] [-v] [-p] pattern
-H: If no option is given, lastplayed is set to the current time
-H: and numplayed is increased by one. Otherwise, only the given
-H: options are taken into account.
+H: If no option is given, the lastplayed field is set to the current time
+H: and the value of the numplayed field is increased by one. Otherwise,
+H: only the given options are taken into account.
H:
H: Options:
H:
-H: -n Set numplayed count. The number of times afs has selected this
-H: audio file for streaming.
+H: -n Set the numplayed count, i.e. the number of times this audio
+H: file was selected for streaming so far.
H:
-H: -l Set lastplayed time. The last time this audio file was selected.
-H: Must be given as the number of seconds since the epoch. Example:
+H: -l Set the lastplayed time, i.e. the last time this audio file was
+H: selected for streaming. The argument must be a number of seconds
+H: since the epoch. Example:
H:
H: touch -l=$(date +%s) file
H:
H: sets the lastplayed time of 'file' to the current time.
H:
-H: -y Set the lyrics id. Specify the lyrics data file associated with
-H: this audio file.
+H: -y Set the lyrics ID which specifies the lyrics data file associated
+H: with the audio file.
H:
-H: -i Set the image id. Same as -y, but sets the image.
+H: -i Like -y, but sets the image ID.
H:
H: -a Set the amplification value (0-255). This determines a scaling
H: factor by which the amplitude should be multiplied in order to
P: AFS_READ | AFS_WRITE
D: Copy audio file selector info.
U: cpsi [-a] [-y] [-i] [-l] [-n] [-v] source pattern...
-H: If no option, or only the -v option is given, all fields of
-H: the audio file selector info are copied to all files
-H: matching pattern. Otherwise, only the given options are
-H: taken into account.
+H: If no option, or only the -v option is given, all fields of the
+H: audio file selector info are copied to all files matching pattern.
+H: Otherwise, only the given options are taken into account.
H:
H: Options:
H:
N: add@member@
O: int com_add@member@(struct command_context *cc);
P: AFS_READ | AFS_WRITE
-D: Read data from stdin and add it as a blob to the @member@ table.
+D: Add stdin as a blob to the @member@ table.
U: add@member@ @member@_name
-H: Read arbitrary binary data from stdin and send that data to
-H: the audio file selector process which creates a new blob for
-H: the data in the corresponding osl table.
-H:
-H: The names of the blobs of a table are unique. If an entry with the
-H: given name already exists, its contents are replaced by the new data.
+H: Read from stdin and ask the audio file selector to create a blob in the
+H: corresponding osl table. If the named blob already exists, it gets replaced
+H: with the new data.
---
T: cat
N: cat@member@
P: AFS_READ
D: Dump the contents of a blob of type @member@ to stdout.
U: cat@member@ @member@_name
-H: This command may be used to retrieve the blob identified by
-H: the given name from the corresponding osl table to which
-H: they were previously added.
+H: Retrieve the named blob and write it to stdout.
---
T: ls
N: ls@member@
P: AFS_READ
D: List blobs of type @member@ matching a pattern.
U: ls@member@ [-i] [-l] [-r] [pattern]
-H: Print a list of the names of all blobs in the corresponding
-H: osl table which match the given pattern. If no pattern is
-H: given, the full list is printed.
+H: Print the list of all blobs which match the given pattern. If no
+H: pattern is given, the full list is printed.
H:
H: Options:
H:
P: AFS_READ | AFS_WRITE
D: Remove blob(s) of type @member@ from the @member@ table.
U: rm@member@ pattern...
-H: Remove all blobs from the corresponding table which match
-H: any given pattern.
+H: Remove all blobs whose name matches any of the given patterns.
---
T: mv
N: mv@member@
P: AFS_READ | AFS_WRITE
D: Rename a blob of type @member@.
U: mv@member@ old_@member@_name new_@member@_name
-H: Rename the blob identified by the first name as the second name.
+H: Rename the blob identified by old_@member@_name to new_@member@_name.
+H: This command fails if new_@member@_name already exists.
unsigned char *hash;
};
-/** Data about the current audio file, passed from afs to server. */
-struct audio_file_data {
- /** The open file descriptor to the current audio file. */
- int fd;
- /** Vss needs this for streaming. */
- struct afh_info afhi;
- /** Size of the largest chunk. */
- uint32_t max_chunk_size;
- /** Needed to get the audio file header. */
- uint8_t audio_format_id;
-};
-
/**
* Codes used for communication between the server and the afs process.
*
para_fd_set(st->fd, &s->rfds, &s->max_fileno);
}
-static int signal_post_select(struct sched *s, __a_unused void *context)
+static int signal_post_select(struct sched *s, void *context)
{
- int signum;
+ struct signal_task *st = context;
+ int ret, signum;
+
+ ret = task_get_notification(st->task);
+ if (ret < 0)
+ return ret;
signum = para_next_signal(&s->rfds);
switch (signum) {
case SIGINT:
case SIGTERM:
case SIGHUP:
PARA_NOTICE_LOG("received signal %d\n", signum);
- clean_exit(EXIT_FAILURE, "caught deadly signal");
+ task_notify_all(s, E_AUDIOD_SIGNAL);
+ return -E_AUDIOD_SIGNAL;
}
return 0;
}
struct timeval tmp, delay;
bool force = true;
- ret = handle_connect(ct->fd, &s->rfds);
+ ret = task_get_notification(ct->task);
if (ret < 0)
+ return ret;
+ ret = handle_connect(ct->fd, &s->rfds);
+ if (ret < 0) {
PARA_ERROR_LOG("%s\n", para_strerror(-ret));
- else if (ret > 0)
+ if (ret == -E_AUDIOD_TERM) {
+ task_notify_all(s, -ret);
+ return ret;
+ }
+ } else if (ret > 0)
goto dump;
/* if last status dump was less than 500ms ago, do nothing */
close_slot(i);
}
-/**
- * Close the connection to para_server and exit.
- *
- * \param status The exit status which is passed to exit(3).
- * \param msg The log message
- *
- * Log \a msg with loglevel \p EMERG, close the connection to para_server and
- * all slots, and call \p exit(status). \a status should be either EXIT_SUCCESS
- * or EXIT_FAILURE.
+/*
+ * Cleanup all resources.
*
- * \sa exit(3).
+ * This performs various cleanups, removes the audiod socket and closes the
+ * connection to para_server.
*/
-void __noreturn clean_exit(int status, const char *msg)
+static void audiod_cleanup(void)
{
if (socket_name)
unlink(socket_name);
close_unused_slots();
audiod_cmdline_parser_free(&conf);
close_stat_clients();
- PARA_EMERG_LOG("%s\n", msg);
- exit(status);
}
/*
static int status_post_select(struct sched *s, void *context)
{
struct status_task *st = context;
+ int ret;
+ ret = task_get_notification(st->task);
+ if (ret < 0)
+ return ret;
if (audiod_status == AUDIOD_OFF) {
if (!st->ct)
goto out;
if (st->ct) {
char *buf;
size_t sz;
- int ret;
ret = btr_node_status(st->btrn, st->min_iqs, BTR_NT_LEAF);
if (ret < 0) {
sched.default_timeout.tv_sec = 2;
sched.default_timeout.tv_usec = 999 * 1000;
ret = schedule(&sched);
+ audiod_cleanup();
sched_shutdown(&sched);
- PARA_EMERG_LOG("%s\n", para_strerror(-ret));
- return EXIT_FAILURE;
+ if (ret < 0)
+ PARA_EMERG_LOG("%s\n", para_strerror(-ret));
+ return ret < 0? EXIT_FAILURE : EXIT_SUCCESS;
}
return grab_client_new(fd, argc, argv, &sched);
}
-__noreturn static int com_term(int fd, __a_unused int argc, __a_unused char **argv)
+static int com_term(int fd, __a_unused int argc, __a_unused char **argv)
{
close(fd);
- clean_exit(EXIT_SUCCESS, "terminating on user request");
+ return -E_AUDIOD_TERM;
}
static int com_on(int fd, __a_unused int argc, __a_unused char **argv)
if (ret < 0) {
if (scd.sender_num < 0)
return ret;
- msg = senders[scd.sender_num].help();
+ if (strcmp(cc->argv[2], "status") == 0)
+ msg = senders[scd.sender_num].status();
+ else
+ msg = senders[scd.sender_num].help();
return send_sb(&cc->scc, msg, strlen(msg), SBD_OUTPUT, false);
}
usleep(100 * 1000);
continue;
}
- memcpy(&mmd->sender_cmd_data, &scd, sizeof(scd));
+ mmd->sender_cmd_data = scd;
mutex_unlock(mmd_mutex);
break;
}
/* server info */
static int com_si(struct command_context *cc)
{
- int i, ret;
- char *msg, *ut, *sender_info = NULL;
+ int ret;
+ char *msg, *ut;
if (cc->argc != 1)
return -E_COMMAND_SYNTAX;
mutex_lock(mmd_mutex);
- for (i = 0; senders[i].name; i++) {
- char *info = senders[i].info();
- sender_info = para_strcat(sender_info, info);
- free(info);
- }
ut = daemon_get_uptime_str(now);
ret = xasprintf(&msg,
- "version: %s\n"
"up: %s\nplayed: %u\n"
"server_pid: %d\n"
"afs_pid: %d\n"
"connections (active/accepted/total): %u/%u/%u\n"
"current loglevel: %s\n"
- "supported audio formats: %s\n"
- "%s",
- version_git(),
+ "supported audio formats: %s\n",
ut, mmd->num_played,
(int)getppid(),
(int)mmd->afs_pid,
mmd->num_commands,
mmd->num_connects,
conf.loglevel_arg,
- AUDIO_FORMAT_HANDLERS,
- sender_info
+ AUDIO_FORMAT_HANDLERS
);
mutex_unlock(mmd_mutex);
free(ut);
- free(sender_info);
return send_sb(&cc->scc, msg, ret, SBD_OUTPUT, false);
}
#include <sys/socket.h>
#include <regex.h>
#include <sys/types.h>
-#include <osl.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <netdb.h>
#include "error.h"
#include "string.h"
#include "afh.h"
-#include "afs.h"
#include "server.h"
#include "net.h"
#include "list.h"
return list;
}
-static char *dccp_info(void)
+static char *dccp_status(void)
{
- char *info = get_sender_info(dss, "dccp");
- char *ret = make_message("%s" "\tsupported ccids: %s\n",
- info, dccp_list_available_ccids());
- free(info);
- return ret;
+ char *status = generic_sender_status(dss, "dccp");
+ char *result = make_message("%ssupported ccids: %s\n", status,
+ dccp_list_available_ccids());
+ free(status);
+ return result;
}
/**
{
int ret, k, n;
- s->info = dccp_info;
+ s->status = dccp_status;
s->send = NULL;
s->pre_select = dccp_pre_select;
s->post_select = dccp_post_select;
PARA_ERROR(NOT_PLAYING, "not playing"), \
PARA_ERROR(AUDIOD_OFF, "audiod switched off"), \
PARA_ERROR(STATUS_TIMEOUT, "status item timeout"), \
+ PARA_ERROR(AUDIOD_SIGNAL, "caught deadly signal"), \
+ PARA_ERROR(AUDIOD_TERM, "terminating on user request"), \
#define AUDIOD_COMMAND_ERRORS \
#include <sys/socket.h>
#include <regex.h>
#include <sys/types.h>
-#include <osl.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <netdb.h>
#include "string.h"
#include "server.cmdline.h"
#include "afh.h"
-#include "afs.h"
#include "server.h"
#include "http.h"
#include "list.h"
return 1;
}
-static char *http_info(void)
+static char *http_status(void)
{
- return get_sender_info(hss, "http");
+ return generic_sender_status(hss, "http");
}
/**
void http_send_init(struct sender *s)
{
int ret;
- s->info = http_info;
+ s->status = http_status;
s->send = http_send;
s->pre_select = http_pre_select;
s->post_select = http_post_select;
kill_stream(pt);
pt->next_file = ret;
pt->rq = CRT_FILE_CHANGE;
+ pt->start_chunk = 0;
return 0;
}
kill_stream(pt);
pt->next_file = ret;
pt->rq = CRT_FILE_CHANGE;
+ pt->start_chunk = 0;
return 0;
}
/** \file send.h Sender-related defines and structures. */
/** The sender subcommands. */
-enum {SENDER_ADD, SENDER_DELETE, SENDER_ALLOW, SENDER_DENY, SENDER_ON, SENDER_OFF, NUM_SENDER_CMDS};
+enum sender_subcommand {
+ SENDER_ADD, /**< Add a target (udp only). */
+ SENDER_DELETE, /**< Delete a target (udp only). */
+ SENDER_ALLOW, /**< Allow connections from given IP address(es). */
+ SENDER_DENY, /**< Deny connections from given IP address(es). */
+ SENDER_ON, /**< Activate the sender. */
+ SENDER_OFF, /**< Deactivate the sender. */
+ NUM_SENDER_CMDS /**< Used as array size in struct \ref sender. */
+};
/**
* Describes one supported sender of para_server.
*
* The result must be dynamically allocated and is freed by the caller.
*/
- char* (*info)(void);
+ char* (*status)(void);
/**
* The send-hook.
*
void shutdown_clients(struct sender_status *ss);
void init_sender_status(struct sender_status *ss, char **access_arg, int num_access_args,
int port, int max_clients, int default_deny);
-char *get_sender_info(struct sender_status *ss, const char *name);
+char *generic_sender_status(struct sender_status *ss, const char *name);
void generic_com_allow(struct sender_command_data *scd,
struct sender_status *ss);
*
* \return The string printed in the "si" command.
*/
-char *get_sender_info(struct sender_status *ss, const char *name)
+char *generic_sender_status(struct sender_status *ss, const char *name)
{
char *clnts = NULL, *ret;
struct sender_client *sc, *tmp_sc;
clnts = tmp;
}
ret = make_message(
- "%s sender:\n"
- "\tstatus: %s\n"
- "\tport: %s\n"
- "\tnumber of connected clients: %d\n"
- "\tmaximal number of clients: %d%s\n"
- "\tconnected clients: %s\n"
- "\taccess %s list: %s\n",
- name,
+ "status: %s\n"
+ "port: %s\n"
+ "number of connected clients: %d\n"
+ "maximal number of clients: %d%s\n"
+ "connected clients: %s\n"
+ "access %s list: %s\n",
(ss->listen_fd >= 0)? "on" : "off",
stringify_port(ss->port, strcmp(name, "http") ? "dccp" : "tcp"),
ss->num_clients,
---
N: ff
P: VSS_READ | VSS_WRITE
-D: Jump amount of time forwards or backwards in current audio file.
+D: Jump N seconds forward or backward.
U: ff n[-]
-H: Set the 'R' (reposition request) bit of the vss status flags
-H: and enqueue a request to jump n seconds forwards or backwards
-H: in the current audio file.
+H: This sets the 'R' (reposition request) bit of the vss status flags
+H: which enqueues a request to jump n seconds forwards or backwards.
H:
-H: EXAMPLE
+H: Example:
H:
-H: ff 30-
+H: para_client ff 30-
H:
H: jumps 30 seconds backwards.
---
D: Print online help.
U: help [command]
H: Without any arguments, help prints a list of available commands. When
-H: issued with a command name as first argument, print out a description
-H: for that command.
+H: called with a command name as first argument, it prints the description
+H: of that command.
---
N: hup
P: VSS_WRITE
-D: Force reload of config file, log file and user list.
+D: Reload config file, log file and user list.
U: hup
H: Reread the config file and the user list file, close and reopen the log
-H: file, and tell all children to do the same.
+H: file, and ask the afs process to do the same. Sending the HUP signal to
+H: the server process has the same effect.
---
N: jmp
P: VSS_READ | VSS_WRITE
-D: Jump to given position in current audio file.
-U: jmp [n]
-H: Set the 'R' (reposition request) bit of the vss status flags
-H: and enqueue a request to jump to n% of the current audio file,
-H: where 0 <= n <= 100.
+D: Jump to the given position.
+U: jmp n
+H: Set the 'R' (reposition request) bit of the vss status flags and enqueue a
+H: request to jump to n% of the current audio file, where 0 <= n <= 100.
---
N: next
P: VSS_READ | VSS_WRITE
-D: Skip rest of the current audio file.
+D: Close the current audio file.
U: next
-H: Set the 'N' (next audio file) bit of the vss status flags. When
-H: playing, change audio file immediately. Equivalent to stop
-H: if paused, NOP if stopped.
+H: Set the 'N' (next audio file) bit of the vss status flags which instructs the
+H: server to close its current audio file if necessary. If the 'P' bit (playing)
+H: is on, playing continues with the next audio file. This command is equivalent
+H: to stop if paused, and has no effect if stopped.
---
N: nomore
P: VSS_READ | VSS_WRITE
D: Stop playing after current audio file.
U: nomore
-H: Set the 'O' (no more) bit of the vss status flags. This instructs
-H: para_server to clear the 'P' (playing) bit as soon as it encounters
-H: the 'N' (next audio file) bit being set.
-H: Use this command instead of stop if you don't like
-H: sudden endings.
+H: Set the 'O' (no more) bit of the vss status flags which asks para_server to
+H: clear the 'P' (playing) bit after the 'N' (next audio file) bit transitions
+H: from off to on (because the end of the current audio file is reached). Use this
+H: command instead of stop if you don't like sudden endings.
---
N: pause
P: VSS_READ | VSS_WRITE
---
N: play
P: VSS_READ | VSS_WRITE
-D: Start playing or resume playing when paused.
+D: Start or resume playing.
U: play
-H: Set the 'P' (playing) bit of the vss status flags. This
-H: results in starting/continuing to stream.
+H: Set the 'P' (playing) bit of the vss status flags.
---
N: sender
P: VSS_READ | VSS_WRITE
-D: Control paraslash internal senders.
+D: Control paraslash senders.
U: sender [s cmd [arguments]]
-H: send command cmd to sender s. cmd may be one of the following:
-H: help, on, off, add, delete, allow, or deny. Note that not all senders
-H: support each command. Try e.g. 'para_client sender http help' for
-H: more information about the http sender. If no argument is given,
-H: print out a list of all senders that are compiled in.
+H: Send a command to a specific sender. The following commands are available, but
+H: not all senders support every command.
+H:
+H: help, on, off, add, delete, allow, deny, status.
+H:
+H: The help command prints the help text of the given sender. If no command is
+H: given the list of compiled in senders is shown.
+H:
+H: Example:
+H:
+H: para_client sender http help
---
N: si
P: 0
D: Print server info.
U: si
-H: Print server uptime and other information.
+H: Show server and afs PID, number of connections, uptime and more.
---
N: stat
P: VSS_READ
-D: Print status info for the current audio file.
+D: Print information about the current audio file.
U: stat [-n=num] [-p]
-H: If -n is given, the command exits after having displayed the status n
-H: times. Otherwise, the command runs in an endless loop.
+H: If -n is given, exit after the status information has been shown n times.
+H: Otherwise, the command runs in an endless loop.
H:
H: The -p option activates parser-friendly output: Each status item is
-H: prefixed with its size in bytes and the status items identifiers are
+H: prefixed with its size in bytes and the status item identifiers are
H: printed as numerical values.
---
N: stop
P: VSS_READ | VSS_WRITE
-D: Stop streaming.
+D: Stop playing.
U: stop
-H: Clear the 'P' (play) bit and set the 'N' bit of the vss status
-H: flags.
+H: Clear the 'P' (playing) bit and set the 'N' (next audio file) bit of the vss
+H: status flags, effectively stopping playback.
---
N: term
P: VSS_READ | VSS_WRITE
-D: Terminate para_server.
+D: Ask the server to terminate.
U: term
-H: Shuts down the server. Instead of this command, you can also send
-H: SIGINT or SIGTERM. It should never be necessary to send SIGKILL.
+H: Shut down the server. Instead of this command, you can also send SIGINT or
+H: SIGTERM to the para_server process. It should never be necessary to send
+H: SIGKILL.
---
N: version
P: 0
-D: Print server's version.
+D: Print the git version string of para_server.
U: version
-H: Show version and other info
+H: Show version and other info.
#include <net/if.h>
#include <arpa/inet.h>
#include <sys/un.h>
-#include <osl.h>
#include <netdb.h>
#include "server.cmdline.h"
#include "error.h"
#include "string.h"
#include "afh.h"
-#include "afs.h"
#include "server.h"
#include "list.h"
#include "send.h"
return ret;
}
-static char *udp_info(void)
+static char *udp_status(void)
{
struct sender_client *sc;
char *ret, *tgts = NULL;
tgts = tmp;
}
ret = make_message(
- "udp sender:\n"
- "\tstatus: %s\n"
- "\tport: %s\n"
- "\ttargets: %s\n",
+ "status: %s\n"
+ "port: %s\n"
+ "targets: %s\n",
(sender_status == SENDER_ON)? "on" : "off",
stringify_port(conf.udp_default_port_arg, "udp"),
tgts? tgts : "(none)"
void udp_send_init(struct sender *s)
{
INIT_LIST_HEAD(&targets);
- s->info = udp_info;
+ s->status = udp_status;
s->help = udp_help;
s->send = NULL;
s->pre_select = NULL;
Examples
~~~~~~~~
-The sender command of para_server allows to (de-)activate senders
-and to change the access permissions senders at runtime. The "si"
-(server info) command is used to list the streaming options of the
-currently running server as well as the various sender access lists.
+The "si" (server info) command lists some information about the
+currently running server process.
--> Show client/target/access lists:
+-> Show PIDs, number of connected clients, uptime, and more:
para_client si
+The sender command of para_server prints information about senders,
+like the various access control lists, and it allows to (de-)activate
+senders and to change the access permissions at runtime.
+
+-> List all senders
+
+ para_client sender
+
-> Obtain general help for the sender command:
para_client help sender
s=http # or dccp or udp
para_client sender $s help
+-> Show status of the http sender
+
+ para_client sender http status
+
By default para_server activates both the HTTP and th DCCP sender on
startup. This can be changed via command line options or para_server's
config file.