12 #include <sys/types.h>
13 #include <arpa/inet.h>
14 #include <sys/socket.h>
15 #include <netinet/in.h>
16 #include <netinet/ip.h>
42 struct in6_addr addr6;
43 char addrstr[INET_ADDRSTRLEN];
50 #define Lsnprintf(...) \
51 snprintf((buf != NULL) ? buf + nrc : NULL,(buflen != 0) ? buflen - nrc : 0, \
75 nrc +=
Lsnprintf(
"{ .sun_family = AF_UNIX, .sun_path = \"@%s\" }",
78 nrc +=
Lsnprintf(
"{ .sun_family = AF_UNIX, .sun_path = \"%s\" }",
84 else if (family == AF_INET) {
93 port = ntohs((uint16_t)
v_unum(v));
100 addr.s_addr = (uint32_t)
v_unum(v);
101 inet_ntop(AF_INET,&addr,addrstr,
sizeof(addrstr));
103 nrc +=
Lsnprintf(
"{ .sin_family = AF_INET, .sin_port = %hu, .sin_addr = { .s_addr = \"%s\" } }",
108 else if (family == AF_INET6) {
114 verror(
"could not load sin6_port");
118 port = ntohs((uint16_t)
v_unum(v));
122 verror(
"could not load sin6_flowinfo");
126 flowinfo = ntohl((uint32_t)
v_unum(v));
130 verror(
"could not load sin6_addr");
134 memcpy(&addr6.s6_addr,v->
buf,
135 ((
unsigned)v->
bufsiz >
sizeof(addr6.s6_addr)) ?
sizeof(addr6.s6_addr) : (
unsigned)v->
bufsiz);
136 inet_ntop(AF_INET6,&addr6,addrstr,
sizeof(addrstr));
140 verror(
"could not load sin6_scope_id");
144 scopeid = ntohl((uint32_t)
v_unum(v));
146 nrc +=
Lsnprintf(
"{ .sin6_family = AF_INET6, .sin6_port = %hu, .sin6_flowinfo = %u, .sin6_addr = { .s6_addr = \"%s\" }, .sin6_scope_id = %u }",
147 port,flowinfo,addrstr,scopeid);
163 int iovlen_noload = 0;
164 int iovbase_noload = 0;
166 unsigned char *ibuf,*ibuf2;
175 #define Lsnprintf(...) \
176 snprintf((buf != NULL) ? buf + nrc : NULL,(buflen != 0) ? buflen - nrc : 0, \
197 if (!iovbase_noload && iovbase != 0 && iovlen) {
198 ibuf =
malloc(iovlen + 1);
207 for (j = 0; j < iovlen; ++j) {
208 if (!isgraph(ibuf[j]) && !isspace(ibuf[j])) {
216 ibuf2 =
malloc(iovlen * 2 + 1);
217 for (j = 0; j < iovlen; ++j) {
219 sprintf((
char *)(ibuf2 + j * 2),
"%.2hhx",ibuf[j]);
221 ibuf2[iovlen * 2] =
'\0';
223 nrc +=
Lsnprintf(
"{ .iov_base = 0h%s",ibuf2);
227 nrc +=
Lsnprintf(
"{ .iov_base = \"%s\"",ibuf);
231 else if (!iovbase_noload) {
256 short iovlen_noload = 0,controllen_noload = 0;
263 int32_t cmsglevel,cmsgtype;
264 unsigned char *ibuf,*ibuf2;
272 #define Lsnprintf(...) \
273 snprintf((buf != NULL) ? buf + nrc : NULL,(buflen != 0) ? buflen - nrc : 0, \
309 nrc +=
Lsnprintf(
", .msg_namelen = %u",namelen);
324 controllen_noload = 1;
345 for (i = 0; i < iovlen; ++
i) {
350 (buf != NULL) ? buf + nrc : NULL,
351 (buflen != 0) ? buflen - nrc : 0);
352 if ((i + 1) >= iovlen)
385 if (controllen > 0) {
398 while ((i + typesize) <= controllen) {
416 if ((cmsglen + i) > controllen) {
431 cmsglevel =
v_i32(v2);
440 cmsgtype =
v_i32(v2);
447 ibuf =
malloc(cmsglen - typesize + 1);
449 cmsglen - typesize,ibuf)) {
450 nrc +=
Lsnprintf(
"{ .cmsg_len = %"PRIuNUM", .cmsg_level = %d, .cmsg_type = %d, .cmsg_data = ? }",
451 cmsglen,cmsglevel,cmsgtype);
455 ibuf2 =
malloc((cmsglen - typesize) * 2 + 1);
456 for (j = 0; j < (cmsglen - typesize); ++j) {
457 sprintf((
char *)(ibuf2 + j * 2),
"%.2hhx",ibuf[j]);
459 ibuf2[(cmsglen - typesize) * 2] =
'\0';
461 nrc +=
Lsnprintf(
"{ .cmsg_len = %"PRIuNUM", .cmsg_level = %d, .cmsg_type = %d, .cmsg_data = 0h%s }",
462 cmsglen,cmsglevel,cmsgtype,ibuf2);
470 nrc +=
Lsnprintf(
"{ .cmsg_len = %"PRIuNUM", .cmsg_level = %d, .cmsg_type = %d, .cmsg_data = ? }",
471 cmsglen,cmsglevel,cmsgtype);
491 if (controllen_noload)
492 nrc +=
Lsnprintf(
", .msg_controllen = ?");
588 .
name =
"os_linux_generic_decoder_lib",
struct value * target_load_type(struct target *target, struct symbol *type, ADDR addr, load_flags_t flags)
int target_decoder_binding_add(struct target_decoder_binding *tdb, struct bsymbol *bsymbol, target_decoder_t dfn)
struct bsymbol * cmsghdr_type
static uint64_t unsigned int i
struct bsymbol * target_lookup_sym(struct target *target, const char *name, const char *delim, char *srcfile, symbol_type_flag_t ftype)
struct symbol * sockaddr_ptr_type
int os_linux_sockaddr_snprintf(struct target *target, void *_data, struct value *value, char *buf, int buflen)
#define verror(format,...)
unsigned char * target_read_addr(struct target *target, ADDR addr, unsigned long length, unsigned char *buf)
struct target_decoder_lib os_linux_generic_decoder_lib
REFCNT bsymbol_release(struct bsymbol *bsymbol)
struct bsymbol * sockaddr_in_type
void value_free(struct value *value)
struct value * target_load_value_member(struct target *target, struct target_location_ctxt *tlctxt, struct value *old_value, const char *member, const char *delim, load_flags_t flags)
struct bsymbol * sockaddr_un_type
REFCNT symbol_release(struct symbol *symbol)
ADDR v_addr(struct value *v)
struct value * value_reload_as_type(struct value *value, struct symbol *type, int force)
num_t v_num(struct value *v)
struct bsymbol * sockaddr_in6_type
void * calloc(size_t nmemb, size_t size)
struct bsymbol * msghdr_type
unsigned int symbol_type_full_bytesize(struct symbol *type)
struct symbol * symbol_type_skip_ptrs(struct symbol *type)
int os_linux_iovec_snprintf(struct target *target, void *_data, struct value *value, char *buf, int buflen)
struct symbol * bsymbol_get_symbol(struct bsymbol *bsymbol)
struct bsymbol * sockaddr_type
int32_t v_i32(struct value *v)
struct bsymbol * cmsgcred_type
struct symbol * target_create_synthetic_type_pointer(struct target *target, struct symbol *type)
void * malloc(size_t size)
void os_linux_generic_decoder_lib_register(void)
uint32_t v_u32(struct value *v)
int os_linux_generic_decoder_lib_unbind(struct target_decoder_binding *tdb, void *_data)
int target_decoder_lib_register(struct target_decoder_lib *lib)
unum_t v_unum(struct value *v)
ADDR value_addr(struct value *value)
int os_linux_msghdr_snprintf(struct target *target, void *_data, struct value *value, char *buf, int buflen)
void * os_linux_generic_decoder_lib_bind(struct target_decoder_binding *tdb)