|
NAME
LIBRARYPDEL Library (libpdel, -lpdel) SYNOPSIS
DESCRIPTIONThe
/* This structure describes one field in a structure */
struct structs_field {
const char *name; /* field name */
const struct structs_type *type; /* field type */
u_int16_t size; /* field size */
u_int16_t offset; /* field offset */
};
The fields need not be listed in the array in the same order as
they are declared in the C structure. However, the array must be terminated
with #define STRUCTS_STRUCT_FIELD_END {
NULL, NULL, 0, 0 }The
To define a field and give it a
different
structs(3)
name than its name in the C structure, use
SEE ALSOlibpdel(3), structs(3), structs_type(3), structs_type_union(3) EXAMPLESThe program below prints out the contents (as an ASCII string) of the field specified on the command line: #include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <pdel/structs/structs.h>
#include <pdel/structs/type/struct.h>
#include <pdel/structs/type/string.h>
#include <pdel/structs/type/ip4.h>
#include <pdel/util/typed_mem.h>
/* My structure */
struct foobar {
char *name;
u_int16_t index;
struct in_addr ipaddr;
};
/* Structs type describing a 'struct foobar' */
static const struct structs_field foobar_fields = {
STRUCTS_STRUCT_FIELD(foobar, name, &structs_type_string),
STRUCTS_STRUCT_FIELD(foobar, index, &structs_type_uint16),
STRUCTS_STRUCT_FIELD(foobar, ipaddr, &structs_type_ip4),
STRUCTS_STRUCT_FIELD_END
};
static const struct structs_type foobar_type =
STRUCTS_STRUCT_TYPE(foobar, &foobar_fields);
int
main(int argc, char **argv)
{
struct foobar f;
const char *fieldname;
char *fieldvalue;
/* Initialize our structure with some contents */
if (structs_init(&foobar_type, NULL, &f) == -1)
err(1, "structs_init");
f.index = 123;
(void)inet_aton("12.34.56.78", &f.ipaddr);
if (structs_set_string(&foobar_type, "name",
"this is a string", &f, NULL, 0) == -1)
err(1, "structs_set_string");
/* Get the requested field's name from the command line */
if (argc != 2)
err(1, "usage: getfield <fieldname>");
fieldname = argv[1];
/* Display the requested field's value */
if ((fieldvalue = structs_get_string(&foobar_type,
fieldname, &f, TYPED_MEM_TEMP)) == NULL)
err(1, "%s", fieldname);
printf("The value of field \"%s\" is: %s\n",
fieldname, fieldvalue);
/* Done, clean up */
FREE(TYPED_MEM_TEMP, fieldvalue);
structs_free(&foobar_type, NULL, &f);
return (0);
}
HISTORYThe PDEL library was developed at Packet Design, LLC.
AUTHORSArchie Cobbs ⟨archie@freebsd.org⟩
|