diff options
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/Android.mk | 3 | ||||
| -rw-r--r-- | libc/kernel/common/linux/msm_vidc_enc.h | 67 | ||||
| -rw-r--r-- | libc/netbsd/resolv/res_cache.c | 91 | ||||
| -rw-r--r-- | libc/private/resolv_iface.h | 3 |
4 files changed, 110 insertions, 54 deletions
diff --git a/libc/Android.mk b/libc/Android.mk index ee7fece..5fb5f13 100644 --- a/libc/Android.mk +++ b/libc/Android.mk @@ -806,6 +806,9 @@ LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk LOCAL_WHOLE_STATIC_LIBRARIES := libbionic_ssp libc_bionic libc_netbsd LOCAL_SYSTEM_SHARED_LIBRARIES := +# TODO: split out the asflags. +LOCAL_ASFLAGS := $(LOCAL_CFLAGS) + include $(BUILD_STATIC_LIBRARY) diff --git a/libc/kernel/common/linux/msm_vidc_enc.h b/libc/kernel/common/linux/msm_vidc_enc.h index 29c4cc9..9d9bc6d 100644 --- a/libc/kernel/common/linux/msm_vidc_enc.h +++ b/libc/kernel/common/linux/msm_vidc_enc.h @@ -261,169 +261,170 @@ struct venc_ioctl_msg{ #define VEN_IOCTL_SET_SLICE_DELIVERY_MODE _IO(VEN_IOCTLBASE_ENC, 50) #define VEN_IOCTL_SET_SPS_PPS_FOR_IDR _IOW(VEN_IOCTLBASE_ENC, 51, struct venc_ioctl_msg) /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +#define VEN_IOCTL_SET_VUI_BITSTREAM_RESTRICT_FLAG _IO(VEN_IOCTLBASE_ENC, 52) struct venc_switch{ unsigned char status; }; -struct venc_allocatorproperty{ /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct venc_allocatorproperty{ unsigned long mincount; unsigned long maxcount; unsigned long actualcount; - unsigned long datasize; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long datasize; unsigned long suffixsize; unsigned long alignment; unsigned long bufpoolid; -}; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; struct venc_bufferpayload{ unsigned char *pbuffer; size_t sz; - int fd; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + int fd; unsigned int offset; unsigned int maped_size; unsigned long filled_len; -}; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; struct venc_buffer{ unsigned char *ptrbuffer; unsigned long sz; - unsigned long len; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long len; unsigned long offset; long long timestamp; unsigned long flags; - void *clientdata; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + void *clientdata; }; struct venc_basecfg{ unsigned long input_width; - unsigned long input_height; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long input_height; unsigned long dvs_width; unsigned long dvs_height; unsigned long codectype; - unsigned long fps_num; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long fps_num; unsigned long fps_den; unsigned long targetbitrate; unsigned long inputformat; -}; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; struct venc_profile{ unsigned long profile; }; -struct ven_profilelevel{ /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct ven_profilelevel{ unsigned long level; }; struct venc_sessionqp{ - unsigned long iframeqp; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long iframeqp; unsigned long pframqp; }; struct venc_qprange{ - unsigned long maxqp; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long maxqp; unsigned long minqp; }; struct venc_intraperiod{ - unsigned long num_pframes; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long num_pframes; unsigned long num_bframes; }; struct venc_seqheader{ - unsigned char *hdrbufptr; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned char *hdrbufptr; unsigned long bufsize; unsigned long hdrlen; }; -struct venc_capability{ /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct venc_capability{ unsigned long codec_types; unsigned long maxframe_width; unsigned long maxframe_height; - unsigned long maxtarget_bitrate; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long maxtarget_bitrate; unsigned long maxframe_rate; unsigned long input_formats; unsigned char dvs; -}; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; struct venc_entropycfg{ unsigned longentropysel; unsigned long cabacmodel; -}; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; struct venc_dbcfg{ unsigned long db_mode; unsigned long slicealpha_offset; - unsigned long slicebeta_offset; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long slicebeta_offset; }; struct venc_intrarefresh{ unsigned long irmode; - unsigned long mbcount; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long mbcount; }; struct venc_multiclicecfg{ unsigned long mslice_mode; - unsigned long mslice_size; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long mslice_size; }; struct venc_bufferflush{ unsigned long flush_mode; -}; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; struct venc_ratectrlcfg{ unsigned long rcmode; }; -struct venc_voptimingcfg{ /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct venc_voptimingcfg{ unsigned long voptime_resolution; }; struct venc_framerate{ - unsigned long fps_denominator; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long fps_denominator; unsigned long fps_numerator; }; struct venc_targetbitrate{ - unsigned long target_bitrate; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long target_bitrate; }; struct venc_rotation{ unsigned long rotation; -}; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; struct venc_timeout{ unsigned long millisec; }; -struct venc_headerextension{ /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +struct venc_headerextension{ unsigned long header_extension; }; struct venc_msg{ - unsigned long statuscode; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long statuscode; unsigned long msgcode; struct venc_buffer buf; unsigned long msgdata_size; -}; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; struct venc_recon_addr{ unsigned char *pbuffer; unsigned long buffer_size; - unsigned long pmem_fd; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + unsigned long pmem_fd; unsigned long offset; }; struct venc_recon_buff_size{ - int width; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ + int width; int height; int size; int alignment; -}; /* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */ +}; #endif diff --git a/libc/netbsd/resolv/res_cache.c b/libc/netbsd/resolv/res_cache.c index 838e084..afc9a36 100644 --- a/libc/netbsd/resolv/res_cache.c +++ b/libc/netbsd/resolv/res_cache.c @@ -572,8 +572,6 @@ _dnsPacket_checkQName( DnsPacket* packet ) static int _dnsPacket_checkQR( DnsPacket* packet ) { - int len; - if (!_dnsPacket_checkQName(packet)) return 0; @@ -832,8 +830,6 @@ _dnsPacket_hashQName( DnsPacket* packet, unsigned hash ) static unsigned _dnsPacket_hashQR( DnsPacket* packet, unsigned hash ) { - int len; - hash = _dnsPacket_hashQName(packet, hash); hash = _dnsPacket_hashBytes(packet, 4, hash); /* TYPE and CLASS */ return hash; @@ -1020,8 +1016,58 @@ typedef struct Entry { } Entry; /** - * Parse the answer records and find the smallest - * TTL among the answer records. + * Find the TTL for a negative DNS result. This is defined as the minimum + * of the SOA records TTL and the MINIMUM-TTL field (RFC-2308). + * + * Return 0 if not found. + */ +static u_long +answer_getNegativeTTL(ns_msg handle) { + int n, nscount; + u_long result = 0; + ns_rr rr; + + nscount = ns_msg_count(handle, ns_s_ns); + for (n = 0; n < nscount; n++) { + if ((ns_parserr(&handle, ns_s_ns, n, &rr) == 0) && (ns_rr_type(rr) == ns_t_soa)) { + const u_char *rdata = ns_rr_rdata(rr); // find the data + const u_char *edata = rdata + ns_rr_rdlen(rr); // add the len to find the end + int len; + u_long ttl, rec_result = ns_rr_ttl(rr); + + // find the MINIMUM-TTL field from the blob of binary data for this record + // skip the server name + len = dn_skipname(rdata, edata); + if (len == -1) continue; // error skipping + rdata += len; + + // skip the admin name + len = dn_skipname(rdata, edata); + if (len == -1) continue; // error skipping + rdata += len; + + if (edata - rdata != 5*NS_INT32SZ) continue; + // skip: serial number + refresh interval + retry interval + expiry + rdata += NS_INT32SZ * 4; + // finally read the MINIMUM TTL + ttl = ns_get32(rdata); + if (ttl < rec_result) { + rec_result = ttl; + } + // Now that the record is read successfully, apply the new min TTL + if (n == 0 || rec_result < result) { + result = rec_result; + } + } + } + return result; +} + +/** + * Parse the answer records and find the appropriate + * smallest TTL among the records. This might be from + * the answer records if found or from the SOA record + * if it's a negative result. * * The returned TTL is the number of seconds to * keep the answer in the cache. @@ -1041,14 +1087,20 @@ answer_getTTL(const void* answer, int answerlen) if (ns_initparse(answer, answerlen, &handle) >= 0) { // get number of answer records ancount = ns_msg_count(handle, ns_s_an); - for (n = 0; n < ancount; n++) { - if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) { - ttl = ns_rr_ttl(rr); - if (n == 0 || ttl < result) { - result = ttl; + + if (ancount == 0) { + // a response with no answers? Cache this negative result. + result = answer_getNegativeTTL(handle); + } else { + for (n = 0; n < ancount; n++) { + if (ns_parserr(&handle, ns_s_an, n, &rr) == 0) { + ttl = ns_rr_ttl(rr); + if (n == 0 || ttl < result) { + result = ttl; + } + } else { + XLOG("ns_parserr failed ancount no = %d. errno = %s\n", n, strerror(errno)); } - } else { - XLOG("ns_parserr failed ancount no = %d. errno = %s\n", n, strerror(errno)); } } } else { @@ -1197,6 +1249,7 @@ typedef struct resolv_cache_info { struct resolv_cache_info* next; char* nameservers[MAXNS +1]; struct addrinfo* nsaddrinfo[MAXNS + 1]; + char* domains; } CacheInfo; #define HTABLE_VALID(x) ((x) != NULL && (x) != HTABLE_DELETED) @@ -1252,7 +1305,7 @@ _cache_check_pending_request_locked( struct resolv_cache* cache, Entry* key ) } else { struct timespec ts = {0,0}; ts.tv_sec = _time_now() + PENDING_REQUEST_TIMEOUT; - int rv = pthread_cond_timedwait(&ri->cond, &cache->lock, &ts); + pthread_cond_timedwait(&ri->cond, &cache->lock, &ts); } } @@ -1306,7 +1359,6 @@ static void _cache_flush_locked( Cache* cache ) { int nn; - time_t now = _time_now(); for (nn = 0; nn < cache->max_entries; nn++) { @@ -1442,6 +1494,7 @@ _dump_answer(const void* answer, int answerlen) remove("/data/reslog.txt"); } else { + errno = 0; // else debug is introducing error signals XLOG("_dump_answer: can't open file\n"); } } @@ -1577,9 +1630,7 @@ _resolv_cache_lookup( struct resolv_cache* cache, int answersize, int *answerlen ) { - DnsPacket pack[1]; Entry key[1]; - int index; Entry** lookup; Entry* e; time_t now; @@ -1752,8 +1803,6 @@ static struct resolv_cache_info* _create_cache_info( void ); static struct resolv_cache* _find_named_cache_locked(const char* ifname); /* gets a resolv_cache_info associated with an interface name, or NULL if not found */ static struct resolv_cache_info* _find_cache_info_locked(const char* ifname); -/* free dns name server list of a resolv_cache_info structure */ -static void _free_nameservers(struct resolv_cache_info* cache_info); /* look up the named cache, and creates one if needed */ static struct resolv_cache* _get_res_cache_for_iface_locked(const char* ifname); /* empty the named cache */ @@ -1989,7 +2038,8 @@ _resolv_set_default_iface(const char* ifname) } void -_resolv_set_nameservers_for_iface(const char* ifname, char** servers, int numservers) +_resolv_set_nameservers_for_iface(const char* ifname, char** servers, int numservers, + const char *domains) { int i, rt, index; struct addrinfo hints; @@ -2023,6 +2073,7 @@ _resolv_set_nameservers_for_iface(const char* ifname, char** servers, int numser cache_info->nsaddrinfo[index] = NULL; } } + cache_info->domains = strdup(domains); } pthread_mutex_unlock(&_res_cache_list_lock); } diff --git a/libc/private/resolv_iface.h b/libc/private/resolv_iface.h index f562687..3fe586e 100644 --- a/libc/private/resolv_iface.h +++ b/libc/private/resolv_iface.h @@ -48,7 +48,8 @@ __BEGIN_DECLS extern void _resolv_set_default_iface(const char* ifname); /* set name servers for an interface */ -extern void _resolv_set_nameservers_for_iface(const char* ifname, char** servers, int numservers); +extern void _resolv_set_nameservers_for_iface(const char* ifname, char** servers, int numservers, + const char *domains); /* tell resolver of the address of an interface */ extern void _resolv_set_addr_of_iface(const char* ifname, struct in_addr* addr); |
