-/*
- * Copyright (C) 1997-2012 Andre Noll <maan@systemlinux.org>
- *
- * Licensed under the GPL v2. For licencing details see COPYING.
- */
+/* Copyright (C) 1997 Andre Noll <maan@tuebingen.mpg.de>, see file COPYING. */
/** \file para.h global paraslash definitions */
#include <limits.h>
#include <stdarg.h>
#include <ctype.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <sys/socket.h>
-#include <sys/un.h> /* needed by create_pf_socket */
#include <string.h>
#include <assert.h>
#include <stdbool.h>
+#include <inttypes.h>
+#include <sys/uio.h>
#include "gcc-compat.h"
/** used in various contexts */
*
*/
#define DEFINE_STDERR_LOGGER(funcname, loglevel_barrier) \
- __printf_2_3 void funcname(int ll, const char* fmt,...) \
+ static __printf_2_3 void funcname(int ll, const char* fmt,...) \
{ \
va_list argp; \
if (ll < loglevel_barrier) \
/** Sent by para_client to initiate the authentication procedure. */
#define AUTH_REQUEST_MSG "auth rsa "
-/** Sent by para_server for commands that expect a data file. */
-#define AWAITING_DATA_MSG "\nAwaiting Data."
-/** Sent by para_server if authentication was successful. */
-#define PROCEED_MSG "Proceed."
-/** Length of the \p PROCEED_MSG string. */
-#define PROCEED_MSG_LEN strlen(PROCEED_MSG)
-/** Sent by para_client to indicate the end of the command line. */
-#define EOC_MSG "\nEnd of Command."
/* exec */
int para_exec_cmdline_pid(pid_t *pid, const char *cmdline, int *fds);
/* time */
-int tv_diff(const struct timeval *b, const struct timeval *a, struct timeval *diff);
-long unsigned tv2ms(const struct timeval*);
-void d2tv(double, struct timeval*);
-void tv_add(const struct timeval*, const struct timeval *, struct timeval *);
-void tv_scale(const unsigned long, const struct timeval *, struct timeval *);
+int tv_diff(const struct timeval *b, const struct timeval *a,
+ struct timeval *diff);
+long unsigned tv2ms(const struct timeval *tv);
+void tv_add(const struct timeval *a, const struct timeval *b,
+ struct timeval *sum);
+void tv_scale(const unsigned long mult, const struct timeval *tv,
+ struct timeval *result);
void tv_divide(const unsigned long divisor, const struct timeval *tv,
- struct timeval *result);
+ struct timeval *result);
int tv_convex_combination(const long a, const struct timeval *tv1,
const long b, const struct timeval *tv2,
struct timeval *result);
-void ms2tv(const long unsigned n, struct timeval *tv);
+void ms2tv(long unsigned n, struct timeval *tv);
void compute_chunk_time(long unsigned chunk_num,
struct timeval *chunk_tv, struct timeval *stream_start,
struct timeval *result);
-
-/** The enum of all status items. */
-enum status_items {STATUS_ITEM_ENUM NUM_STAT_ITEMS};
-extern const char *status_item_list[];
-/** Loop over each status item. */
-#define FOR_EACH_STATUS_ITEM(i) for (i = 0; i < NUM_STAT_ITEMS; i++)
-int for_each_stat_item(char *item_buf, size_t num_bytes,
- int (*item_handler)(int, char *));
-
+struct timeval *clock_get_realtime(struct timeval *tv);
/**
* Return a random non-negative integer in an interval.
*
* 2. The wav header (para_write only).
*
- * 3. The --format option of para_write.
+ * 3. The --sample-format option of para_write.
*/
#define SAMPLE_FORMATS \
SAMPLE_FORMAT(SF_S8, "8 bit signed"), \
#define SAMPLE_FORMAT(a, b) b
/** \endcond sample_format */
-/** Debug loglevel, gets really noisy. */
-#define LL_DEBUG 0
-/** Still noisy, but won't fill your disk. */
-#define LL_INFO 1
-/** Normal, but significant event. */
-#define LL_NOTICE 2
-/** Unexpected event that can be handled. */
-#define LL_WARNING 3
-/** Unhandled error condition. */
-#define LL_ERROR 4
-/** System might be unreliable. */
-#define LL_CRIT 5
-/** Last message before exit. */
-#define LL_EMERG 6
-/** Number of all loglevels. */
-#define NUM_LOGLEVELS 7
-
-/** Log messages with lower priority than that will not be compiled in. */
-#define COMPILE_TIME_LOGLEVEL 0
+/** Debug, Info, etc. */
+enum loglevels {LOGLEVELS, NUM_LOGLEVELS};
-/** \cond log */
-#if LL_DEBUG >= COMPILE_TIME_LOGLEVEL
#define PARA_DEBUG_LOG(f,...) para_log(LL_DEBUG, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
-#else
-#define PARA_DEBUG_LOG(...) do {;} while (0)
-#endif
-
-#if LL_INFO >= COMPILE_TIME_LOGLEVEL
#define PARA_INFO_LOG(f,...) para_log(LL_INFO, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
-#else
-#define PARA_INFO_LOG(...) do {;} while (0)
-#endif
-
-#if LL_NOTICE >= COMPILE_TIME_LOGLEVEL
#define PARA_NOTICE_LOG(f,...) para_log(LL_NOTICE, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
-#else
-#define PARA_NOTICE_LOG(...) do {;} while (0)
-#endif
-
-#if LL_WARNING >= COMPILE_TIME_LOGLEVEL
#define PARA_WARNING_LOG(f,...) para_log(LL_WARNING, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
-#else
-#define PARA_WARNING_LOG(...) do {;} while (0)
-#endif
-
-#if LL_ERROR >= COMPILE_TIME_LOGLEVEL
#define PARA_ERROR_LOG(f,...) para_log(LL_ERROR, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
-#else
-#define PARA_ERROR_LOG(...) do {;} while (0)
-#endif
-
-#if LL_CRIT >= COMPILE_TIME_LOGLEVEL
#define PARA_CRIT_LOG(f,...) para_log(LL_CRIT, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
-#else
-#define PARA_CRIT_LOG(...) do {;} while (0)
-#endif
-
-#if LL_EMERG >= COMPILE_TIME_LOGLEVEL
#define PARA_EMERG_LOG(f,...) para_log(LL_EMERG, "%s: " f, __FUNCTION__, ## __VA_ARGS__)
-#else
-#define PARA_EMERG_LOG(...)
-#endif
-/** \endcond log */
+
+#define STATUS_ITEMS \
+ STATUS_ITEM(basename) \
+ STATUS_ITEM(status) \
+ STATUS_ITEM(num_played) \
+ STATUS_ITEM(mtime) \
+ STATUS_ITEM(bitrate) \
+ STATUS_ITEM(frequency) \
+ STATUS_ITEM(file_size) \
+ STATUS_ITEM(status_flags) \
+ STATUS_ITEM(format) \
+ STATUS_ITEM(score) \
+ STATUS_ITEM(techinfo) \
+ STATUS_ITEM(afs_mode) \
+ STATUS_ITEM(attributes_txt) \
+ STATUS_ITEM(decoder_flags) \
+ STATUS_ITEM(audiod_status) \
+ STATUS_ITEM(play_time) \
+ STATUS_ITEM(attributes_bitmap) \
+ STATUS_ITEM(offset) \
+ STATUS_ITEM(seconds_total) \
+ STATUS_ITEM(stream_start) \
+ STATUS_ITEM(current_time) \
+ STATUS_ITEM(audiod_uptime) \
+ STATUS_ITEM(image_id) \
+ STATUS_ITEM(lyrics_id) \
+ STATUS_ITEM(duration) \
+ STATUS_ITEM(directory) \
+ STATUS_ITEM(lyrics_name) \
+ STATUS_ITEM(image_name) \
+ STATUS_ITEM(path) \
+ STATUS_ITEM(hash) \
+ STATUS_ITEM(channels) \
+ STATUS_ITEM(last_played) \
+ STATUS_ITEM(num_chunks) \
+ STATUS_ITEM(chunk_time) \
+ STATUS_ITEM(amplification) \
+ STATUS_ITEM(artist) \
+ STATUS_ITEM(title) \
+ STATUS_ITEM(year) \
+ STATUS_ITEM(album) \
+ STATUS_ITEM(comment) \
+ STATUS_ITEM(max_chunk_size) \
+
+#define STATUS_ITEM(_name) SI_ ##_name,
+enum status_items {STATUS_ITEMS NUM_STAT_ITEMS};
+#undef STATUS_ITEM
+#define STATUS_ITEM(_name) #_name,
+
+extern const char *status_item_list[];
+/** Loop over each status item. */
+#define FOR_EACH_STATUS_ITEM(i) for (i = 0; i < NUM_STAT_ITEMS; i++)
+int for_each_stat_item(char *item_buf, size_t num_bytes,
+ int (*item_handler)(int, char *));