tarball_delete := $(addprefix $(tarball_pfx)/, web .gitignore)
tarball := $(tarball_pfx).tar.bz2
-.PHONY: dep all clean clean2 distclean maintainer-clean install man tarball
-all: dep $(prefixed_executables) $(man_pages)
-dep: $(deps)
+.PHONY: all clean clean2 distclean maintainer-clean install man tarball
+all: $(prefixed_executables) $(man_pages)
man: $(man_pages)
tarball: $(tarball)
NEWS
====
+------------------------------------------
+0.5.7 (to be announced) "semantic density"
+------------------------------------------
+- Speedup of the base64 decoder.
+- One of the two source browsers has been removed from the web pages.
+ The doxygen API reference still contains an HTML version of each
+ source file.
+
+Download: [tarball](./releases/paraslash-git.tar.bz2)
+
---------------------------------------
0.5.6 (2016-07-10) "cascading gradient"
---------------------------------------
if (ret >= 0)
goto out;
/* ignore subsequent errors (but log them) */
- para_printf(&aca->pbout, "could not activate %s: %s\n"
- "switching back to %s\n",
- arg, para_strerror(-ret), current_mop? current_mop : "dummy");
- ret = activate_mood_or_playlist(current_mop, &num_admissible);
- if (ret >= 0)
- goto out;
- para_printf(&aca->pbout, "could not activate %s: %s\nswitching to dummy\n",
- current_mop, para_strerror(-ret));
+ para_printf(&aca->pbout, "could not activate %s\n", arg);
+ if (current_mop) {
+ int ret2;
+ para_printf(&aca->pbout, "switching back to %s\n", current_mop);
+ ret2 = activate_mood_or_playlist(current_mop, &num_admissible);
+ if (ret2 >= 0)
+ goto out;
+ para_printf(&aca->pbout, "could not reactivate %s: %s\n",
+ current_mop, para_strerror(-ret2));
+ }
+ para_printf(&aca->pbout, "activating dummy mood\n");
activate_mood_or_playlist(NULL, &num_admissible);
out:
para_printf(&aca->pbout, "activated %s (%d admissible files)\n",
EMBRACE(.name = f->name, .parent = parent,
.handler = f->execute, .context = fn));
- f->open(fn);
+ if (f->open)
+ f->open(fn);
sprintf(buf, "%s (slot %d)", f->name, (int)(s - slot));
fn->task = task_register(&(struct task_info) {
.name = buf,
if (ret < 0 || n == 0)
goto out;
ct->features = parse_features(buf);
- if (!has_feature("sideband", ct)) {
- PARA_ERROR_LOG("server has no sideband support\n");
- ret = -E_INCOMPAT_FEAT;
- goto out;
- }
ct->status = CL_RECEIVED_WELCOME;
return 0;
case CL_RECEIVED_WELCOME: /* send auth command */
}
struct connection_features {
- bool sideband_requested;
bool aes_ctr128_requested;
};
create_argv(p, ",", &features);
for (i = 0; features[i]; i++) {
if (strcmp(features[i], "sideband") == 0)
- cf->sideband_requested = true;
- else if (strcmp(features[i], "aes_ctr128") == 0)
+ continue;
+ if (strcmp(features[i], "aes_ctr128") == 0)
cf->aes_ctr128_requested = true;
else {
ret = -E_BAD_FEATURE;
ret = parse_auth_request(buf, ret, &cc->u, &cf);
if (ret < 0)
goto net_err;
- if (!cf.sideband_requested) { /* sideband is mandatory */
- PARA_ERROR_LOG("client did not request sideband\n");
- ret = -E_BAD_FEATURE;
- goto net_err;
- }
if (cc->u) {
get_random_bytes_or_die(rand_buf, sizeof(rand_buf));
ret = pub_encrypt(cc->u->pubkey, rand_buf, sizeof(rand_buf),
PARA_ERROR(SERVER_EOF, "connection closed by para_server"), \
PARA_ERROR(SERVER_CMD_SUCCESS, "command terminated successfully"), \
PARA_ERROR(SERVER_CMD_FAILURE, "command failed"), \
- PARA_ERROR(INCOMPAT_FEAT, "client/server incompatibility"), \
#define NET_ERRORS \
ti.pre_select = f->pre_select;
ti.post_select = f->post_select;
ti.context = fn;
- f->open(fn);
+ if (f->open)
+ f->open(fn);
fn->task = task_register(&ti, &s);
parent = fn->btrn;
}
/**
* Open one instance of this filter.
*
- * This should allocate the output buffer of the given filter node and do any
- * other filter-specific preparations like initializing the private_data member
- * of \a fn suitably. The open function is assumed to succeed.
+ * This should allocate the output buffer of the given filter node and
+ * do any other filter-specific preparations like initializing the
+ * private_data member of \a fn suitably. The open function is
+ * optional, If it is provided, it is assumed to succeed.
*/
void (*open)(struct filter_node *fn);
/**
* Close one instance of this filter.
*
- * Free all resources of associated with \a fn that were previously allocated
- * by the open() function. It's OK to leave this alone if the filter does not
- * need any cleanups.
+ * Free all resources associated with \a fn that were previously
+ * allocated by the open() function. It's OK to set this to NULL if the
+ * filter does not need to perform any cleanup operation.
*/
void (*close)(struct filter_node *fn);
/**
}
if (*o == ':')
- if (para_atoi32(++o, port) < 0 ||
- *port < 0 || *port > 0xffff)
+ if (para_atoi32(++o, port) < 0 || *port < 0 || *port > 0xffff)
goto failed;
if (host_string_ok(host))
return host;
/**
* Stringify port number, resolve into service name where defined.
+ *
* \param port 2-byte port number, in host-byte-order.
* \param transport Transport protocol name (e.g. "udp", "tcp"), or NULL.
* \return Pointer to static result buffer.
pt->fn.btrn = btr_new_node(&(struct btr_node_description)
EMBRACE(.name = decoder->name, .parent = pt->rn.btrn,
.handler = decoder->execute, .context = &pt->fn));
- decoder->open(&pt->fn);
+ if (decoder->open)
+ decoder->open(&pt->fn);
/* setup default writer */
pt->wn.conf = check_writer_arg_or_die(NULL, &pt->wn.writer_num);
test_duration()
{
local t=$(exec 2>&1 1>/dev/null; time -p "$@")
- result=$(awk '{print $2 * 1000}' <<< $t)
+ result=$(awk '{print $2 * 1000; exit 0}' <<< "$t")
}
test_expect_success()
<h2> Source code documentation </h2>
<ul>
-
- <li> <a href="doxygen/html/index.html">API
- Reference</a>. </li>
-
- <li> <a href="HTML/index.html">Browsable source</a>. </li>
-
+ <li> <a href="doxygen/html/index.html">API Reference</a> </li>
</ul>