Index: ossp-pkg/sa/TODO RCS File: /v/ossp/cvs/ossp-pkg/sa/TODO,v co -q -kk -p'1.1.1.1' '/v/ossp/cvs/ossp-pkg/sa/TODO,v' | diff -u /dev/null - -L'ossp-pkg/sa/TODO' 2>/dev/null --- ossp-pkg/sa/TODO +++ - 2025-12-21 16:22:37.665906659 +0100 @@ -0,0 +1,17 @@ + +Goals: +1. struct sockaddr * abstraction +2. ssize_t abstraction +3. cache socket descriptors weil kein close existiert +4. jede funktion hat timeout-possibility (connect_smart!) +5. optional readline and buffering functionality + +TODO: +buffer == 0 -> fully unbuffered +timeout == 0 -> fully blocking + +- Unix domain sockets support +- aufpassen dasz fuer read/write STREAM socket ist +- aufpassen dasz fuer readfrom/writeto DGRAM socket ist +- destructor fuer sa_addr_t? + Index: ossp-pkg/sa/sa.h RCS File: /v/ossp/cvs/ossp-pkg/sa/sa.h,v co -q -kk -p'1.1.1.1' '/v/ossp/cvs/ossp-pkg/sa/sa.h,v' | diff -u /dev/null - -L'ossp-pkg/sa/sa.h' 2>/dev/null --- ossp-pkg/sa/sa.h +++ - 2025-12-21 16:22:37.668668375 +0100 @@ -0,0 +1,90 @@ +/* +** SA - OSSP Socket Abstraction Library +** Copyright (c) 2001 The OSSP Project (http://www.ossp.org/) +** Copyright (c) 2001 Cable & Wireless Deutschland (http://www.cw.com/de/) +** +** This file is part of OSSP SA, a socket abstraction library which +** can be found at http://www.ossp.org/pkg/sa/. +** +** Permission to use, copy, modify, and distribute this software for +** any purpose with or without fee is hereby granted, provided that +** the above copyright notice and this permission notice appear in all +** copies. +** +** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR +** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +** SUCH DAMAGE. +** +** sa.h: socket abstraction API +*/ + +#ifndef __SA_H__ +#define __SA_H__ + +/* system definitions of "size_t", "socklen_t", "struct sockaddr" */ +#include +#include +#include + +/* socket address abstraction object type */ +struct sa_addr_st; +typedef struct sa_addr_st sa_addr_t; + +/* socket abstraction object type */ +struct sa_st; +typedef struct sa_st sa_t; + +/* return codes */ +typedef enum { + SA_OK, + SA_ERR_ARG, + SA_ERR_USE, + SA_ERR_MEM, + SA_ERR_SYS, + SA_ERR_INT +} sa_rc_t; + +/* address operations */ +sa_rc_t sa_u2a (sa_addr_t **saa, const char *uri, ...); +sa_rc_t sa_s2a (sa_addr_t **saa, const struct sockaddr *sabuf, socklen_t salen); +sa_rc_t sa_a2u (const sa_addr_t *saa, char **uri); +sa_rc_t sa_a2s (const sa_addr_t *saa, struct sockaddr **sabuf, socklen_t *salen); + +/* object operations */ +sa_rc_t sa_create (sa_t **sa); +sa_rc_t sa_destroy (sa_t *sa); + +/* parameter operations */ +sa_rc_t sa_timeout (sa_t *sa, long sec, long usec); +sa_rc_t sa_buffers (sa_t *sa, size_t rsize, size_t wsize); + +/* connection operations */ +sa_rc_t sa_bind (sa_t *sa, sa_addr_t *laddr); +sa_rc_t sa_connect (sa_t *sa, sa_addr_t *raddr); +sa_rc_t sa_listen (sa_t *sa, int backlog); +sa_rc_t sa_accept (sa_t *sa, sa_addr_t **caddr, sa_t **csa); +sa_rc_t sa_getremote(sa_t *sa, sa_addr_t **raddr); +sa_rc_t sa_getlocal (sa_t *sa, sa_addr_t **laddr); +sa_rc_t sa_getfd (sa_t *sa, int *fd); +sa_rc_t sa_shutdown (sa_t *sa, char *flags); + +/* input/output operations */ +sa_rc_t sa_read (sa_t *sa, char *buf, size_t buflen, size_t *bufdone); +sa_rc_t sa_readfrom (sa_t *sa, char *buf, size_t buflen, size_t *bufdone, sa_addr_t **raddr); +sa_rc_t sa_readline (sa_t *sa, char *buf, size_t buflen, size_t *bufdone); +sa_rc_t sa_write (sa_t *sa, const char *buf, size_t buflen, size_t *bufdone); +sa_rc_t sa_writeto (sa_t *sa, const char *buf, size_t buflen, size_t *bufdone, sa_addr_t *raddr); +sa_rc_t sa_printf (sa_t *sa, const char *fmt, ...); +sa_rc_t sa_flush (sa_t *sa); + +#endif /* __SA_H__ */ + Index: ossp-pkg/sa/sa.pod RCS File: /v/ossp/cvs/ossp-pkg/sa/sa.pod,v co -q -kk -p'1.1.1.1' '/v/ossp/cvs/ossp-pkg/sa/sa.pod,v' | diff -u /dev/null - -L'ossp-pkg/sa/sa.pod' 2>/dev/null --- ossp-pkg/sa/sa.pod +++ - 2025-12-21 16:22:37.671501924 +0100 @@ -0,0 +1,219 @@ +## +## SA - OSSP Socket Abstraction Library +## Copyright (c) 2001 The OSSP Project (http://www.ossp.org/) +## Copyright (c) 2001 Cable & Wireless Deutschland (http://www.cw.com/de/) +## +## This file is part of OSSP SA, a socket abstraction library which +## can be found at http://www.ossp.org/pkg/sa/. +## +## Permission to use, copy, modify, and distribute this software for +## any purpose with or without fee is hereby granted, provided that +## the above copyright notice and this permission notice appear in all +## copies. +## +## THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED +## WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +## MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +## IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR +## CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF +## USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +## ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +## OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT +## OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +## SUCH DAMAGE. +## +## sa.pod: socket abstraction library manual page +## + +=pod + +=head1 NAME + +B - Socket Abstraction Library + +=head1 SYNOPSIS + +=over 4 + +=item B: + +sa_addr_t, +sa_t. + +=item B
: + +sa_u2a, +sa_s2a, +sa_a2u, +sa_a2s. + +=item B: + +sa_create, +sa_destroy. + +=item B: + +sa_timeout, +sa_buffers. + +=item B: + +sa_bind, +sa_connect, +sa_listen, +sa_accept, +sa_getremote, +sa_getlocal, +sa_shutdown. + +=item B: + +sa_read, +sa_readfrom, +sa_readline, +sa_write, +sa_writeto, +sa_printf, +sa_flush. + +=back + +=head1 DESCRIPTION + +B is a thin abstraction library for the BSD socket interface +for use in conjunction with TCP and UDP protocols. It provides the +following key features: + +=over 4 + +=item B
+ +Most of the uglyness in the BSD socket API is the necessarity to have to +deal with the various address structures (C) which +exist because of both the different network protocols and addressing +schemes. B fully hides this by providing an abstract and +opaque address type (C) together with four utility functions +which allow one to convert from the old C and an URL +specification (C<{tcp,udp}://[:]>) to the C and +vice versa. + +=item B + +Each function of B is aware of a central timeout (set by +sa_timeout(3)), i.e., all I/O operations return C and +C set to C if this timeout expired before the +operation was able to succeed. This allows one to easily program +less-blocking network services. + +=item B + +If B is used for TCP-based stream I/O, internally all I/O +operations can be performed through input and output buffers (set +by sa_buffers(3)) for achieving higher I/O performance by doing I/O +operations on larger messages. + +=item B + +If B is used for TCP-based stream I/O, for convinience reasons +line reading (sa_readline(3)) and output formatting (sa_printf(3)) +functions are provided, modelled after STDIO's fgets(3) and fprintf(3). + +=back + +=head1 DATA TYPES + +=over 4 + +=item B + +=item B + +=back + +=head1 FUNCTIONS + +=head2 Address Operations + +=over 4 + +=item sa_rc_t B(sa_addr_t **I, const char *I, ...); + +=item sa_rc_t B(sa_addr_t **I, const struct sockaddr *I, socklen_t I); + +=item sa_rc_t B(const sa_addr_t *I, char **I); + +=item sa_rc_t B(const sa_addr_t *I, struct sockaddr **I, socklen_t *I); + +=back + +=head2 Object Operations + +=over 4 + +=item sa_rc_t B(sa_t **I); + +=item sa_rc_t B(sa_t *I); + +=back + +=head2 Parameter Operations + +=over 4 + +=item sa_rc_t B(sa_t *I, long I, long I); + +=item sa_rc_t B(sa_t *I, size_t I, size_t I); + +=back + +=head2 Connection Operations + +=over 4 + +=item sa_rc_t B(sa_t *I, sa_addr_t *I); + +=item sa_rc_t B(sa_t *I, sa_addr_t *I); + +=item sa_rc_t B(sa_t *I, int I); + +=item sa_rc_t B(sa_t *I, sa_addr_t **I, sa_t **I); + +=item sa_rc_t B(sa_t *I, sa_addr_t **I); + +=item sa_rc_t B(sa_t *I, sa_addr_t **I); + +=item sa_rc_t B(sa_t *I, char *I); + +=back + +=head2 Input/Output Operations + +=over 4 + +=item sa_rc_t B(sa_t *I, char *I, size_t I, size_t *I); + +=item sa_rc_t B(sa_t *I, char *I, size_t I, size_t *I, sa_addr_t **I); + +=item sa_rc_t B(sa_t *I, char *I, size_t I, size_t *I); + +=item sa_rc_t B(sa_t *I, const char *I, size_t I, size_t *I); + +=item sa_rc_t B(sa_t *I, const char *I, size_t I, size_t *I, sa_addr_t *I); + +=item sa_rc_t B(sa_t *I, const char *I, ...); + +=item sa_rc_t B(sa_t *I); + +=back + +=head1 AUTHORS + + Ralf S. Engelschall + rse@engelschall.com + www.engelschall.com + +=cut + Index: ossp-pkg/sa/test.c RCS File: /v/ossp/cvs/ossp-pkg/sa/Attic/test.c,v co -q -kk -p'1.1' '/v/ossp/cvs/ossp-pkg/sa/Attic/test.c,v' | diff -u /dev/null - -L'ossp-pkg/sa/test.c' 2>/dev/null --- ossp-pkg/sa/test.c +++ - 2025-12-21 16:22:37.674592880 +0100 @@ -0,0 +1,79 @@ + +#include +#include +#include +#include +#include + +#include "sa.h" + +/* see RFC3164 */ + +static void die(char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + fprintf(stderr, "test:ERROR: "); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + exit(1); +} + +int main(int argc, char *argv[]) +{ + sa_addr_t *ra; + sa_addr_t *la; + sa_t *sa; + char caBuf[1024]; + int nBuf; + char caTime[15+1]; + time_t now; + struct tm *tm; + char caHost; + struct utsname uts; + char *cp; + char caTag[32+1]; + char *cpHost; + int n; + + if (sa_u2a(&ra, "udp://%s:514", argv[1]) != SA_OK) + die("sa_u2a ra"); + if (sa_u2a(&la, "udp://0.0.0.0:0") != SA_OK) + die("sa_u2a la"); + if (sa_create(&sa) != SA_OK) + die("sa_create"); + if (sa_bind(sa, la) != SA_OK) + die("sa_bind"); + + /* RFC3164: The BSD syslog Protocol; C. Lonvick; August 2001. */ + + now = time(NULL); + tm = localtime(&now); + strftime(caTime, sizeof(caTime), "%b %e %H:%M:%S", tm); + + if (uname(&uts) == 0) { + cpHost = strdup(uts.nodename); + if ((cp = strchr(cpHost, '.')) != NULL) + *cp = '\0'; + } + else + cpHost = strdup("0.0.0.0"); /* FIXME */ + + strcpy(caTag, "progname[12]: "); + if (strlen(caTag) > 32) + caTag[32] = '\0'; + + sprintf(caBuf, "<%d>%s %s %s%s", LOG_MAIL|LOG_EMERG, caTime, cpHost, caTag, argv[2]); + fprintf(stderr, "%s\n", caBuf); + nBuf = strlen(caBuf); + if (sa_writeto(sa, caBuf, nBuf, &n, ra) != SA_OK) + die("sa_writeto"); + if (sa_destroy(sa) != SA_OK) + die("sa_destroy"); + free(ra); + free(la); + return 0; +} + Index: ossp-pkg/sa/test.c RCS File: /v/ossp/cvs/ossp-pkg/sa/Attic/test.c,v rcsdiff -q -kk '-r1.1' '-r1.1.1.1' -u '/v/ossp/cvs/ossp-pkg/sa/Attic/test.c,v' 2>/dev/null