static char *parse_host(const char *s, uint16_t *ret_port) { pa_assert(s); pa_assert(ret_port); if (*s == '[') { char *e; if (!(e = strchr(s+1, ']'))) return NULL; if (e[1] == ':') { uint32_t p; if (pa_atou(e+2, &p) < 0) return NULL; *ret_port = (uint16_t) p; } else if (e[1] != 0) return NULL; return pa_xstrndup(s+1, (size_t) (e-s-1)); } else { char *e; uint32_t p; if (!(e = strrchr(s, ':'))) return pa_xstrdup(s); if (pa_atou(e+1, &p) < 0) return NULL; *ret_port = (uint16_t) p; return pa_xstrndup(s, (size_t) (e-s)); } }
static void jack_error_func(const char*t) { char *s; s = pa_xstrndup(t, strcspn(t, "\n\r")); pa_log_warn("JACK error >%s<", s); pa_xfree(s); }
static void parse(pa_dynarray*a, const char *s, unsigned args) { int infty = 0; const char delimiter[] = " \t\n\r"; const char *p; pa_assert(a); pa_assert(s); if (args == 0) infty = 1; p = s+strspn(s, delimiter); while (*p && (infty || args >= 2)) { size_t l = strcspn(p, delimiter); char *n = pa_xstrndup(p, l); pa_dynarray_append(a, n); p += l; p += strspn(p, delimiter); args--; } if (args && *p) { char *n = pa_xstrdup(p); pa_dynarray_append(a, n); } }
static char * get_cpuinfo_line(char *cpuinfo, const char *tag) { char *line, *end, *colon; if (!(line = strstr(cpuinfo, tag))) return NULL; if (!(end = strchr(line, '\n'))) return NULL; if (!(colon = strchr(line, ':'))) return NULL; if (++colon >= end) return NULL; return pa_xstrndup(colon, end - colon); }
static pa_hook_result_t parameters_changed_cb(pa_core *c, meego_parameter_update_args *ua, struct algorithm *alg) { pa_assert(c); pa_assert(ua); pa_assert(alg); alg->status = ua->status; algorithm_reset(alg); if (ua->mode) alg->mode = pa_xstrdup(ua->mode); if (ua->parameters) { pa_assert(ua->length > 0); alg->parameters = pa_xstrndup(ua->parameters, ua->length); } pa_log_debug("parameters_changed_cb, status=%s, mode=%s, params=%s", status_to_string(alg->status), pa_strnull(alg->mode), pa_strnull(alg->parameters)); return PA_HOOK_OK; }
static pa_bool_t get_parameters_cb(const void *base_parameters, unsigned len_base_parameters, void **parameters, unsigned *len_parameters, void *userdata) { struct algorithm *alg = (struct algorithm*)userdata; if (alg->modified_parameters) { pa_xfree(alg->modified_parameters); alg->modified_parameters = NULL; } /* As the modifier implementor, we own the modified data */ if (base_parameters) { char *params = pa_xstrndup(base_parameters, len_base_parameters); alg->modified_parameters = pa_sprintf_malloc("%s-modified", params); pa_xfree(params); } else alg->modified_parameters = pa_xstrdup("modified"); *parameters = alg->modified_parameters; *len_parameters = strlen(*parameters); return TRUE; }
pa_format_info* pa_format_info_from_string(const char *str) { pa_format_info *f = pa_format_info_new(); char *encoding = NULL, *properties = NULL; size_t pos; pos = strcspn(str, ","); encoding = pa_xstrndup(str, pos); f->encoding = pa_encoding_from_string(pa_strip(encoding)); if (f->encoding == PA_ENCODING_INVALID) goto error; if (pos != strlen(str)) { pa_proplist *plist; properties = pa_xstrdup(&str[pos+1]); plist = pa_proplist_from_string(properties); if (!plist) goto error; pa_proplist_free(f->plist); f->plist = plist; } out: if (encoding) pa_xfree(encoding); if (properties) pa_xfree(properties); return f; error: pa_format_info_free(f); f = NULL; goto out; }
pa_sdp_info *pa_sdp_parse(const char *t, pa_sdp_info *i, int is_goodbye) { uint16_t port = 0; bool ss_valid = false; pa_assert(t); pa_assert(i); i->origin = i->session_name = NULL; i->salen = 0; i->payload = 255; if (!pa_startswith(t, PA_SDP_HEADER)) { pa_log("Failed to parse SDP data: invalid header."); goto fail; } t += sizeof(PA_SDP_HEADER)-1; while (*t) { size_t l; l = strcspn(t, "\n"); if (l <= 2) { pa_log("Failed to parse SDP data: line too short: >%s<.", t); goto fail; } if (pa_startswith(t, "o=")) i->origin = pa_xstrndup(t+2, l-2); else if (pa_startswith(t, "s=")) i->session_name = pa_xstrndup(t+2, l-2); else if (pa_startswith(t, "c=IN IP4 ")) { char a[64]; size_t k; k = l-8 > sizeof(a) ? sizeof(a) : l-8; pa_strlcpy(a, t+9, k); a[strcspn(a, "/")] = 0; if (inet_pton(AF_INET, a, &((struct sockaddr_in*) &i->sa)->sin_addr) <= 0) { pa_log("Failed to parse SDP data: bad address: >%s<.", a); goto fail; } ((struct sockaddr_in*) &i->sa)->sin_family = AF_INET; ((struct sockaddr_in*) &i->sa)->sin_port = 0; i->salen = sizeof(struct sockaddr_in); #ifdef HAVE_IPV6 } else if (pa_startswith(t, "c=IN IP6 ")) { char a[64]; size_t k; k = l-8 > sizeof(a) ? sizeof(a) : l-8; pa_strlcpy(a, t+9, k); a[strcspn(a, "/")] = 0; if (inet_pton(AF_INET6, a, &((struct sockaddr_in6*) &i->sa)->sin6_addr) <= 0) { pa_log("Failed to parse SDP data: bad address: >%s<.", a); goto fail; } ((struct sockaddr_in6*) &i->sa)->sin6_family = AF_INET6; ((struct sockaddr_in6*) &i->sa)->sin6_port = 0; i->salen = sizeof(struct sockaddr_in6); #endif } else if (pa_startswith(t, "m=audio ")) { if (i->payload > 127) { int _port, _payload; if (sscanf(t+8, "%i RTP/AVP %i", &_port, &_payload) == 2) { if (_port <= 0 || _port > 0xFFFF) { pa_log("Failed to parse SDP data: invalid port %i.", _port); goto fail; } if (_payload < 0 || _payload > 127) { pa_log("Failed to parse SDP data: invalid payload %i.", _payload); goto fail; } port = (uint16_t) _port; i->payload = (uint8_t) _payload; if (pa_rtp_sample_spec_from_payload(i->payload, &i->sample_spec)) ss_valid = true; } } } else if (pa_startswith(t, "a=rtpmap:")) { if (i->payload <= 127) { char c[64]; int _payload; if (sscanf(t+9, "%i %64c", &_payload, c) == 2) { if (_payload < 0 || _payload > 127) { pa_log("Failed to parse SDP data: invalid payload %i.", _payload); goto fail; } if (_payload == i->payload) { c[strcspn(c, "\n")] = 0; if (parse_sdp_sample_spec(&i->sample_spec, c)) ss_valid = true; } } } } t += l; if (*t == '\n') t++; } if (!i->origin || (!is_goodbye && (!i->salen || i->payload > 127 || !ss_valid || port == 0))) { pa_log("Failed to parse SDP data: missing data."); goto fail; } if (((struct sockaddr*) &i->sa)->sa_family == AF_INET) ((struct sockaddr_in*) &i->sa)->sin_port = htons(port); else ((struct sockaddr_in6*) &i->sa)->sin6_port = htons(port); return i; fail: pa_xfree(i->origin); pa_xfree(i->session_name); return NULL; }
int pa_context_connect( pa_context *c, const char *server, pa_context_flags_t flags, const pa_spawn_api *api) { int r = -1; pa_assert(c); pa_assert(PA_REFCNT_VALUE(c) >= 1); PA_CHECK_VALIDITY(c, !pa_detect_fork(), PA_ERR_FORKED); PA_CHECK_VALIDITY(c, c->state == PA_CONTEXT_UNCONNECTED, PA_ERR_BADSTATE); PA_CHECK_VALIDITY(c, !(flags & ~(PA_CONTEXT_NOAUTOSPAWN|PA_CONTEXT_NOFAIL)), PA_ERR_INVALID); PA_CHECK_VALIDITY(c, !server || *server, PA_ERR_INVALID); if (server) c->conf->autospawn = FALSE; else server = c->conf->default_server; pa_context_ref(c); c->no_fail = !!(flags & PA_CONTEXT_NOFAIL); c->server_specified = !!server; pa_assert(!c->server_list); if (server) { if (!(c->server_list = pa_strlist_parse(server))) { pa_context_fail(c, PA_ERR_INVALIDSERVER); goto finish; } } else { char *d; /* Prepend in reverse order */ /* Follow the X display */ if (c->conf->auto_connect_display) { if ((d = getenv("DISPLAY"))) { d = pa_xstrndup(d, strcspn(d, ":")); if (*d) c->server_list = pa_strlist_prepend(c->server_list, d); pa_xfree(d); } } /* Add TCP/IP on the localhost */ if (c->conf->auto_connect_localhost) { c->server_list = pa_strlist_prepend(c->server_list, "tcp6:[::1]"); c->server_list = pa_strlist_prepend(c->server_list, "tcp4:127.0.0.1"); } /* The system wide instance via PF_LOCAL */ c->server_list = pa_strlist_prepend(c->server_list, PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_NATIVE_DEFAULT_UNIX_SOCKET); /* The user instance via PF_LOCAL */ c->server_list = prepend_per_user(c->server_list); } /* Set up autospawning */ if (!(flags & PA_CONTEXT_NOAUTOSPAWN) && c->conf->autospawn) { #ifdef HAVE_GETUID if (getuid() == 0) pa_log_debug("Not doing autospawn since we are root."); else { c->do_autospawn = TRUE; if (api) c->spawn_api = *api; } #endif } pa_context_set_state(c, PA_CONTEXT_CONNECTING); r = try_next_connection(c); finish: pa_context_unref(c); return r; }