本文整理汇总了C++中refbuf_new函数的典型用法代码示例。如果您正苦于以下问题:C++ refbuf_new函数的具体用法?C++ refbuf_new怎么用?C++ refbuf_new使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了refbuf_new函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: command_list_log
static int command_list_log (client_t *client, int response)
{
refbuf_t *content;
const char *logname = httpp_get_query_param (client->parser, "log");
int log = -1;
ice_config_t *config;
if (logname == NULL)
return client_send_400 (client, "No log specified");
config = config_get_config ();
if (strcmp (logname, "errorlog") == 0)
log = config->error_log.logid;
else if (strcmp (logname, "accesslog") == 0)
log = config->access_log.logid;
else if (strcmp (logname, "playlistlog") == 0)
log = config->playlist_log.logid;
if (log < 0)
{
config_release_config();
WARN1 ("request to show unknown log \"%s\"", logname);
return client_send_400 (client, "unknown");
}
content = refbuf_new (0);
log_contents (log, &content->data, &content->len);
config_release_config();
if (response == XSLT)
{
xmlNodePtr xmlnode;
xmlDocPtr doc;
doc = xmlNewDoc(XMLSTR("1.0"));
xmlnode = xmlNewDocNode(doc, NULL, XMLSTR("icestats"), NULL);
xmlDocSetRootElement(doc, xmlnode);
xmlNewTextChild (xmlnode, NULL, XMLSTR("log"), XMLSTR(content->data));
refbuf_release (content);
return admin_send_response (doc, client, XSLT, "showlog.xsl");
}
else
{
refbuf_t *http = refbuf_new (100);
int len = snprintf (http->data, 100, "%s",
"HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\n\r\n");
http->len = len;
http->next = content;
client->respcode = 200;
client_set_queue (client, http);
return fserve_setup_client (client);
}
}
示例2: refbuf_new
refbuf_t *refbuf_copy(refbuf_t *orig)
{
refbuf_t *ret = refbuf_new (orig->len), *ref = ret;
memcpy (ref->data, orig->data, orig->len);
orig = orig->associated;
while (orig)
{
ref->associated = refbuf_new (orig->len);
ref = ref->associated;
memcpy (ref->data, orig->data, orig->len);
orig = orig->associated;
}
return ret;
}
示例3: command_list_mounts
int command_list_mounts(client_t *client, int response)
{
DEBUG0("List mounts request");
client_set_queue (client, NULL);
client->refbuf = refbuf_new (PER_CLIENT_REFBUF_SIZE);
if (response == TEXT)
{
redirector_update (client);
snprintf (client->refbuf->data, PER_CLIENT_REFBUF_SIZE,
"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n");
client->refbuf->len = strlen (client->refbuf->data);
client->respcode = 200;
if (strcmp (httpp_getvar (client->parser, HTTPP_VAR_URI), "/admin/streams") == 0)
client->refbuf->next = stats_get_streams (1);
else
client->refbuf->next = stats_get_streams (0);
return fserve_setup_client (client);
}
else
{
xmlDocPtr doc;
avl_tree_rlock (global.source_tree);
doc = admin_build_sourcelist(NULL);
avl_tree_unlock (global.source_tree);
return admin_send_response (doc, client, response, "listmounts.xsl");
}
}
示例4: ebml_create_client_data
static int ebml_create_client_data (format_plugin_t *format, client_t *client)
{
ebml_client_data_t *ebml_client_data = calloc(1, sizeof(ebml_client_data_t));
ebml_source_state_t *ebml_source_state = format->_state;
int ret = 0;
if ((ebml_client_data) && (ebml_source_state->header))
{
ebml_client_data->header = ebml_source_state->header;
refbuf_addref (ebml_client_data->header); // broken, assumes too much currently
}
client->format_data = ebml_client_data;
client->free_client_data = ebml_free_client_data;
if (client->refbuf == NULL)
client->refbuf = refbuf_new (4096);
client->refbuf->len = 0;
if (format_general_headers (format, client) < 0)
return -1;
return ret;
}
示例5: _add_stats_to_stats_client
static void _add_stats_to_stats_client (client_t *client, const char *fmt, va_list ap)
{
event_listener_t *listener = client->shared_data;
refbuf_t *r = listener->recent_block;
if (r && (r->flags & STATS_BLOCK_CONNECTION) == 0)
{
/* lets see if we can append to an existing block */
if (r->len < 1390)
{
int written = _append_to_bufferv (r, 1400, fmt, ap);
if (written > 0)
{
listener->content_len += written;
return;
}
}
}
r = refbuf_new (1400);
r->len = 0;
if (_append_to_bufferv (r, 1400, fmt, ap) < 0)
{
WARN1 ("stat details are too large \"%s\"", fmt);
refbuf_release (r);
return;
}
_add_node_to_stats_client (client, r);
client->schedule_ms = 0;
}
示例6: client_send_404
int client_send_404 (client_t *client, const char *message)
{
int ret = -1;
if (client->worker == NULL) /* client is not on any worker now */
{
client_destroy (client);
return 0;
}
client_set_queue (client, NULL);
if (client->respcode)
{
worker_t *worker = client->worker;
if (client->respcode >= 300)
client->flags = client->flags & ~CLIENT_AUTHENTICATED;
client->flags |= CLIENT_ACTIVE;
worker_wakeup (worker);
}
else
{
if (client->parser->req_type == httpp_req_head || message == NULL)
message = "Not Available";
ret = strlen (message);
client->refbuf = refbuf_new (PER_CLIENT_REFBUF_SIZE);
snprintf (client->refbuf->data, PER_CLIENT_REFBUF_SIZE,
"HTTP/1.0 404 Not Available\r\n"
"%s\r\nContent-Length: %d\r\nContent-Type: text/html\r\n\r\n"
"%s", client_keepalive_header (client), ret,
message ? message: "");
client->respcode = 404;
client->refbuf->len = strlen (client->refbuf->data);
ret = fserve_setup_client (client);
}
return ret;
}
示例7: client_send_404
int client_send_404 (client_t *client, const char *message)
{
int ret = -1;
if (client->worker == NULL) /* client is not on any worker now */
{
client_destroy (client);
return 0;
}
client_set_queue (client, NULL);
if (client->respcode)
{
worker_t *worker = client->worker;
if (client->respcode >= 300)
client->flags = client->flags & ~CLIENT_AUTHENTICATED;
client->flags |= CLIENT_ACTIVE;
worker_wakeup (worker);
}
else
{
if (message == NULL)
message = "Not Available";
client->refbuf = refbuf_new (PER_CLIENT_REFBUF_SIZE);
snprintf (client->refbuf->data, PER_CLIENT_REFBUF_SIZE,
"HTTP/1.0 404 Not Available\r\n"
"Content-Type: text/html\r\n\r\n"
"<b>%s</b>\r\n", message);
client->respcode = 404;
client->refbuf->len = strlen (client->refbuf->data);
ret = fserve_setup_client (client);
}
return ret;
}
示例8: client_create
/* create a client_t with the provided connection and parser details. Return
* 0 on success, -1 if server limit has been reached. In either case a
* client_t is returned just in case a message needs to be returned. Should
* be called with global lock held.
*/
int client_create (client_t **c_ptr, connection_t *con, http_parser_t *parser)
{
ice_config_t *config;
client_t *client = (client_t *)calloc(1, sizeof(client_t));
int ret = -1;
if (client == NULL)
abort();
config = config_get_config ();
global.clients++;
if (config->client_limit < global.clients)
WARN2 ("server client limit reached (%d/%d)", config->client_limit, global.clients);
else
ret = 0;
config_release_config ();
stats_event_args (NULL, "clients", "%d", global.clients);
client->con = con;
client->parser = parser;
client->refbuf = refbuf_new (PER_CLIENT_REFBUF_SIZE);
client->refbuf->len = 0; /* force reader code to ignore buffer contents */
client->pos = 0;
client->write_to_client = format_generic_write_to_client;
*c_ptr = client;
return ret;
}
示例9: xslt_write_callback
static int xslt_write_callback (void *ctxt, const char *data, int len)
{
struct bufs *x = ctxt;
refbuf_t *r;
int loop = 10;
if (len == 0)
return 0;
if (len < 0 || len > 2000000)
{
ERROR1 ("%d length requested", len);
return -1;
}
while (loop)
{
r = *x->tail;
if (r)
{
x->tail = &r->next;
loop--;
continue;
}
*x->tail = r = refbuf_new (len);
memcpy (r->data, data, len);
x->len += len;
break;
}
return len;
}
示例10: xslt_write_callback
static int xslt_write_callback (void *ctxt, const char *data, int len)
{
struct bufs *x = ctxt;
refbuf_t *r;
int loop = 10;
if (len == 0)
return 0;
if (len < 0 || len > 2000000)
{
ERROR1 ("%d length requested", len);
return -1;
}
while (loop)
{
int size = len > 4096 ? len : 4096;
if (*x->tail == NULL)
{
*x->tail = refbuf_new (size);
(*x->tail)->len = 0;
}
r = *x->tail;
if (r->len + len > size)
{
x->tail = &r->next;
loop--;
continue;
}
memcpy (r->data + r->len, data, len);
r->len += len;
x->len += len;
break;
}
return len;
}
示例11: refbuf_new
refbuf_t *make_refbuf_with_page (ogg_page *page)
{
refbuf_t *refbuf = refbuf_new (page->header_len + page->body_len);
memcpy (refbuf->data, page->header, page->header_len);
memcpy (refbuf->data+page->header_len, page->body, page->body_len);
return refbuf;
}
示例12: format_file_read
int format_file_read (client_t *client, format_plugin_t *plugin, FILE *fp)
{
refbuf_t *refbuf = client->refbuf;
size_t bytes = -1;
int unprocessed = 0;
do
{
if (refbuf == NULL)
{
if (fp == NULL)
return -2;
refbuf = client->refbuf = refbuf_new (4096);
client->pos = refbuf->len;
client->intro_offset = 0;
client->queue_pos = 0;
}
if (client->pos < refbuf->len)
break;
if (fp == NULL || client->flags & CLIENT_HAS_INTRO_CONTENT)
{
if (refbuf->next)
{
//DEBUG1 ("next intro block is %d", refbuf->next->len);
client->refbuf = refbuf->next;
refbuf->next = NULL;
refbuf_release (refbuf);
client->pos = 0;
return 0;
}
//DEBUG0 ("No more intro data ");
client_set_queue (client, NULL);
client->flags &= ~CLIENT_HAS_INTRO_CONTENT;
client->intro_offset = client->connection.sent_bytes;
refbuf = NULL;
continue;
}
if (fseek (fp, client->intro_offset, SEEK_SET) < 0 ||
(bytes = fread (refbuf->data, 1, 4096, fp)) <= 0)
{
return bytes < 0 ? -2 : -1;
}
refbuf->len = bytes;
client->pos = 0;
if (plugin->align_buffer)
{
/* here the buffer may require truncating to keep the buffers aligned on
* certain boundaries */
unprocessed = plugin->align_buffer (client, plugin);
if (unprocessed < 0 || unprocessed >= bytes)
unprocessed = 0;
}
client->intro_offset += (bytes - unprocessed);
} while (1);
return 0;
}
示例13: _handle_source_request
static void _handle_source_request (client_t *client, char *uri, int auth_style)
{
source_t *source;
INFO1("Source logging in at mountpoint \"%s\"", uri);
if (uri[0] != '/')
{
WARN0 ("source mountpoint not starting with /");
client_send_401 (client);
return;
}
if (auth_style == ICECAST_SOURCE_AUTH) {
if (connection_check_source_pass (client->parser, uri) == 0)
{
/* We commonly get this if the source client is using the wrong
* protocol: attempt to diagnose this and return an error
*/
/* TODO: Do what the above comment says */
INFO1("Source (%s) attempted to login with invalid or missing password", uri);
client_send_401(client);
return;
}
}
source = source_reserve (uri);
if (source)
{
if (auth_style == SHOUTCAST_SOURCE_AUTH) {
source->shoutcast_compat = 1;
}
source->client = client;
source->parser = client->parser;
source->con = client->con;
if (connection_complete_source (source, 1) < 0)
{
source_clear_source (source);
source_free_source (source);
}
else
{
refbuf_t *ok = refbuf_new (PER_CLIENT_REFBUF_SIZE);
client->respcode = 200;
snprintf (ok->data, PER_CLIENT_REFBUF_SIZE,
"HTTP/1.0 200 OK\r\n\r\n");
ok->len = strlen (ok->data);
/* we may have unprocessed data read in, so don't overwrite it */
ok->associated = client->refbuf;
client->refbuf = ok;
fserve_add_client_callback (client, source_client_callback, source);
}
}
else
{
client_send_404 (client, "Mountpoint in use");
WARN1 ("Mountpoint %s in use", uri);
}
}
示例14: refbuf_new
/* return a list of blocks which contain lines of text. Each line is a mountpoint
* reference that a slave will use for relaying. The prepend setting is to indicate
* if some something else needs to be added to each line.
*/
refbuf_t *stats_get_streams (int prepend)
{
#define STREAMLIST_BLKSIZE 4096
avl_node *node;
unsigned int remaining = STREAMLIST_BLKSIZE, prelen;
refbuf_t *start = refbuf_new (remaining), *cur = start;
const char *pre = "";
char *buffer = cur->data;
if (prepend)
pre = "/admin/streams?mount=";
prelen = strlen (pre);
/* now the stats for each source */
avl_tree_rlock (_stats.source_tree);
node = avl_get_first(_stats.source_tree);
while (node)
{
int ret;
stats_source_t *source = (stats_source_t *)node->key;
if ((source->flags & STATS_HIDDEN) == 0)
{
if (remaining <= strlen (source->source) + prelen + 3)
{
cur->len = STREAMLIST_BLKSIZE - remaining;
cur->next = refbuf_new (STREAMLIST_BLKSIZE);
remaining = STREAMLIST_BLKSIZE;
cur = cur->next;
buffer = cur->data;
}
ret = snprintf (buffer, remaining, "%s%s\r\n", pre, source->source);
if (ret > 0)
{
buffer += ret;
remaining -= ret;
}
}
node = avl_get_next(node);
}
avl_tree_unlock (_stats.source_tree);
cur->len = STREAMLIST_BLKSIZE - remaining;
return start;
}
示例15: client_send_501
int client_send_501(client_t *client)
{
client_set_queue (client, NULL);
client->refbuf = refbuf_new (PER_CLIENT_REFBUF_SIZE);
snprintf (client->refbuf->data, PER_CLIENT_REFBUF_SIZE,
"HTTP/1.0 501 Not Implemented\r\n\r\n");
client->respcode = 501;
client->refbuf->len = strlen (client->refbuf->data);
return fserve_setup_client (client);
}