diff --git a/stio/lib/Makefile.in b/stio/lib/Makefile.in index afcac3e..534e472 100644 --- a/stio/lib/Makefile.in +++ b/stio/lib/Makefile.in @@ -130,9 +130,8 @@ am__DEPENDENCIES_1 = am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) libstio_la_DEPENDENCIES = $(am__DEPENDENCIES_2) am_libstio_la_OBJECTS = libstio_la-stio.lo libstio_la-stio-pro.lo \ - libstio_la-stio-sck.lo libstio_la-stio-tcp.lo \ - libstio_la-stio-tim.lo libstio_la-stio-tmr.lo \ - libstio_la-stio-udp.lo + libstio_la-stio-sck.lo libstio_la-stio-tim.lo \ + libstio_la-stio-tmr.lo libstio_la_OBJECTS = $(am_libstio_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) @@ -382,8 +381,6 @@ pkginclude_HEADERS = \ stio-cmn.h \ stio-pro.h \ stio-sck.h \ - stio-tcp.h \ - stio-udp.h \ stio.h pkglib_LTLIBRARIES = libstio.la @@ -392,10 +389,8 @@ libstio_la_SOURCES = \ stio.c \ stio-pro.c \ stio-sck.c \ - stio-tcp.c \ stio-tim.c \ - stio-tmr.c \ - stio-udp.c + stio-tmr.c libstio_la_CPPFLAGS = $(CPPFLAGS_LIB_COMMON) libstio_la_LDFLAGS = $(LDFLAGS_LIB_COMMON) @@ -554,10 +549,8 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstio_la-stio-pro.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstio_la-stio-sck.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstio_la-stio-tcp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstio_la-stio-tim.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstio_la-stio-tmr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstio_la-stio-udp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libstio_la-stio.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stio-main.Po@am__quote@ @@ -603,13 +596,6 @@ libstio_la-stio-sck.lo: stio-sck.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstio_la-stio-sck.lo `test -f 'stio-sck.c' || echo '$(srcdir)/'`stio-sck.c -libstio_la-stio-tcp.lo: stio-tcp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstio_la-stio-tcp.lo -MD -MP -MF $(DEPDIR)/libstio_la-stio-tcp.Tpo -c -o libstio_la-stio-tcp.lo `test -f 'stio-tcp.c' || echo '$(srcdir)/'`stio-tcp.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstio_la-stio-tcp.Tpo $(DEPDIR)/libstio_la-stio-tcp.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stio-tcp.c' object='libstio_la-stio-tcp.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstio_la-stio-tcp.lo `test -f 'stio-tcp.c' || echo '$(srcdir)/'`stio-tcp.c - libstio_la-stio-tim.lo: stio-tim.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstio_la-stio-tim.lo -MD -MP -MF $(DEPDIR)/libstio_la-stio-tim.Tpo -c -o libstio_la-stio-tim.lo `test -f 'stio-tim.c' || echo '$(srcdir)/'`stio-tim.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstio_la-stio-tim.Tpo $(DEPDIR)/libstio_la-stio-tim.Plo @@ -624,13 +610,6 @@ libstio_la-stio-tmr.lo: stio-tmr.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstio_la-stio-tmr.lo `test -f 'stio-tmr.c' || echo '$(srcdir)/'`stio-tmr.c -libstio_la-stio-udp.lo: stio-udp.c -@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libstio_la-stio-udp.lo -MD -MP -MF $(DEPDIR)/libstio_la-stio-udp.Tpo -c -o libstio_la-stio-udp.lo `test -f 'stio-udp.c' || echo '$(srcdir)/'`stio-udp.c -@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libstio_la-stio-udp.Tpo $(DEPDIR)/libstio_la-stio-udp.Plo -@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='stio-udp.c' object='libstio_la-stio-udp.lo' libtool=yes @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libstio_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libstio_la-stio-udp.lo `test -f 'stio-udp.c' || echo '$(srcdir)/'`stio-udp.c - stio-main.o: main.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(stio_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT stio-main.o -MD -MP -MF $(DEPDIR)/stio-main.Tpo -c -o stio-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/stio-main.Tpo $(DEPDIR)/stio-main.Po diff --git a/stio/lib/stio-sck.c b/stio/lib/stio-sck.c index dca6bda..dfa21db 100644 --- a/stio/lib/stio-sck.c +++ b/stio/lib/stio-sck.c @@ -404,6 +404,26 @@ static int dev_sck_ioctl (stio_dev_t* dev, int cmd, void* arg) stio_sckfam_t fam; int x; + if (bnd->options & STIO_DEV_SCK_BIND_BROADCAST) + { + int v = 1; + if (setsockopt (rdev->sck, SOL_SOCKET, SO_BROADCAST, &v, STIO_SIZEOF(v)) == -1) + { + rdev->stio->errnum = stio_syserrtoerrnum(errno); + return -1; + } + } + + if (bnd->options & STIO_DEV_SCK_BIND_REUSEADDR) + { + int v = 1; + if (setsockopt (rdev->sck, SOL_SOCKET, SO_REUSEADDR, &v, STIO_SIZEOF(v)) == -1) + { + rdev->stio->errnum = stio_syserrtoerrnum(errno); + return -1; + } + } + if (stio_getsckadrinfo (dev->stio, &bnd->addr, &sl, &fam) <= -1) return -1; /* the socket is already non-blocking */ diff --git a/stio/lib/stio-sck.h b/stio/lib/stio-sck.h index 490e6f6..69cdd1b 100644 --- a/stio/lib/stio-sck.h +++ b/stio/lib/stio-sck.h @@ -142,11 +142,19 @@ struct stio_dev_sck_make_t stio_dev_sck_on_read_t on_read; }; +enum stio_dev_sck_bind_option_t +{ + STIO_DEV_SCK_BIND_BROADCAST = (1 << 0), + STIO_DEV_SCK_BIND_REUSEADDR = (1 << 1) +/* TODO: more options --- TRANSPARENT...SO_RCVBUF, SO_SNDBUF, SO_RCVTIMEO, SO_SNDTIMEO, SO_KEEPALIVE */ +}; +typedef enum stio_dev_sck_bind_option_t stio_dev_sck_bind_option_t; + typedef struct stio_dev_sck_bind_t stio_dev_sck_bind_t; struct stio_dev_sck_bind_t { + int options; stio_sckadr_t addr; - /*int opts;*/ /* TODO: REUSEADDR , TRANSPARENT, etc or someting?? */ /* TODO: add device name for BIND_TO_DEVICE */ }; diff --git a/stio/lib/stio.h b/stio/lib/stio.h index 64706ef..1243c99 100644 --- a/stio/lib/stio.h +++ b/stio/lib/stio.h @@ -286,9 +286,6 @@ enum stio_dev_event_t typedef enum stio_dev_event_t stio_dev_event_t; - - - /* ========================================================================= */ /* TOOD: move these to a separte file */ @@ -305,28 +302,44 @@ typedef enum stio_dev_event_t stio_dev_event_t; #define STIO_IP4ADR_LEN 4 #define STIO_IP6ADR_LEN 16 -#pragma pack(push) -#pragma pack(1) -struct stio_ethadr_t + +#if defined(__GNUC__) +# define STIO_PACKED __attribute__((__packed__)) + +#else +# define STIO_PACKED +# STIO_PACK_PUSH pack(push) +# STIO_PACK_PUSH pack(push) +# STIO_PACK(x) pack(x) +#endif + + +#if defined(__GNUC__) + /* nothing */ +#else + #pragma pack(push) + #pragma pack(1) +#endif +struct STIO_PACKED stio_ethadr_t { stio_uint8_t v[STIO_ETHADR_LEN]; }; typedef struct stio_ethadr_t stio_ethadr_t; -struct stio_ip4adr_t +struct STIO_PACKED stio_ip4adr_t { stio_uint8_t v[STIO_IP4ADR_LEN]; }; typedef struct stio_ip4adr_t stio_ip4adr_t; -struct stio_ip6adr_t +struct STIO_PACKED stio_ip6adr_t { stio_uint8_t v[STIO_IP6ADR_LEN]; }; typedef struct stio_ip6adr_t stio_ip6adr_t; -struct stio_ethhdr_t +struct STIO_PACKED stio_ethhdr_t { stio_uint8_t dest[STIO_ETHADR_LEN]; stio_uint8_t source[STIO_ETHADR_LEN]; @@ -334,7 +347,7 @@ struct stio_ethhdr_t }; typedef struct stio_ethhdr_t stio_ethhdr_t; -struct stio_arphdr_t +struct STIO_PACKED stio_arphdr_t { stio_uint16_t htype; /* hardware type (ethernet: 0x0001) */ stio_uint16_t ptype; /* protocol type (ipv4: 0x0800) */ @@ -345,7 +358,7 @@ struct stio_arphdr_t typedef struct stio_arphdr_t stio_arphdr_t; /* arp payload for ipv4 over ethernet */ -struct stio_etharp_t +struct STIO_PACKED stio_etharp_t { stio_uint8_t sha[STIO_ETHADR_LEN]; /* source hardware address */ stio_uint8_t spa[STIO_IP4ADR_LEN]; /* source protocol address */ @@ -354,14 +367,19 @@ struct stio_etharp_t }; typedef struct stio_etharp_t stio_etharp_t; -struct stio_etharp_pkt_t +struct STIO_PACKED stio_etharp_pkt_t { stio_ethhdr_t ethhdr; stio_arphdr_t arphdr; stio_etharp_t arppld; }; typedef struct stio_etharp_pkt_t stio_etharp_pkt_t; -#pragma pack(pop) + +#if defined(__GNUC__) + /* nothing */ +#else + #pragma pack(pop) +#endif /* ========================================================================= */