namepart ext "(\\.[a-zA-Z0-9]+)$" $1 *
.fi
.TP
+.B new_max \fIMAX\fR
+The maximum number of tracks to list when reporting newly noticed tracks. The
+default is 100.
+.TP
.B nice_rescan \fIPRIORITY\fR
Set the recan subprocess priority. The default is 10.
.IP
.TP
.B new \fR[\fIMAX\fR]
Send the most recently added \fIMAX\fR tracks in a response body. If the
-argument is ommitted, all recently added tracks are listed.
+argument is ommitted, the \fBnew_max\fR most recent tracks are listed (see
+\fBdisorder_config\fR(5)).
.TP
.B nop
Do nothing. Used by
{ C(multicast_loop), &type_boolean, validate_any },
{ C(multicast_ttl), &type_integer, validate_non_negative },
{ C(namepart), &type_namepart, validate_any },
+ { C(new_max), &type_integer, validate_positive },
{ C2(nice, nice_rescan), &type_integer, validate_non_negative },
{ C(nice_rescan), &type_integer, validate_non_negative },
{ C(nice_server), &type_integer, validate_any },
c->cookie_login_lifetime = 86400;
c->cookie_key_lifetime = 86400 * 7;
c->smtp_server = xstrdup("127.0.0.1");
+ c->new_max = 100;
/* Default stopwords */
if(config_set(&cs, (int)NDEFAULT_STOPWORDS, (char **)default_stopwords))
exit(1);
/** @brief Origin address for outbound mail */
char *mail_sender;
+
+ /** @brief Maximum number of tracks in response to 'new' */
+ long new_max;
/* derived values: */
int nparts; /* number of distinct name parts */
/** @brief Tied reader or 0 */
ev_reader *reader;
+
+ /** @brief Set when abandoned */
+ int abandoned;
};
/** @brief State structure for a buffered reader */
void *u) {
ev_writer *const w = u;
- error(0, "abandoning writer %s because no writes within %ds",
- w->what, w->timebound);
- w->error = ETIMEDOUT;
+ if(!w->abandoned) {
+ w->abandoned = 1;
+ error(0, "abandoning writer '%s' because no writes within %ds",
+ w->what, w->timebound);
+ w->error = ETIMEDOUT;
+ }
return writer_shutdown(ev, now, u);
}
/* The new buffer contents will exceed the space bound. We assume that the
* remote client has gone away and TCP hasn't noticed yet, or that it's got
* hopelessly stuck. */
- error(0, "abandoning writer %s because buffer has reached %td bytes",
- w->what, w->b.end - w->b.start);
- ev_fd_disable(w->ev, ev_write, w->fd);
- w->error = EPIPE;
- return ev_timeout(w->ev, 0, 0, writer_shutdown, w);
+ if(!w->abandoned) {
+ w->abandoned = 1;
+ error(0, "abandoning writer '%s' because buffer has reached %td bytes",
+ w->what, w->b.end - w->b.start);
+ ev_fd_disable(w->ev, ev_write, w->fd);
+ w->error = EPIPE;
+ return ev_timeout(w->ev, 0, 0, writer_shutdown, w);
+ } else
+ return 0;
}
/* Make sure there is space */
buffer_space(&w->b, n);
static int c_new(struct conn *c,
char **vec,
int nvec) {
- char **tracks = trackdb_new(0, nvec > 0 ? atoi(vec[0]) : INT_MAX);
+ int max, n;
+ char **tracks;
+ if(nvec > 0)
+ max = atoi(vec[0]);
+ else
+ max = INT_MAX;
+ if(max <= 0 || max > config->new_max)
+ max = config->new_max;
+ tracks = trackdb_new(0, max);
sink_printf(ev_writer_sink(c->w), "253 New track list follows\n");
+ n = 0;
while(*tracks) {
sink_printf(ev_writer_sink(c->w), "%s%s\n",
**tracks == '.' ? "." : "", *tracks);