/* ** SA - OSSP Socket Abstraction Library ** Copyright (c) 2001 Ralf S. Engelschall ** Copyright (c) 2001 The OSSP Project ** Copyright (c) 2001 Cable & Wireless Deutschland ** ** 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_test.c: socket abstraction library test suite */ #include #include #include #include #include #include #include "sa.h" #define DIE_MARK \ __FILE__, __LINE__ static void die(const char *file, int line, char *fmt, ...) { va_list ap; va_start(ap, fmt); fprintf(stderr, "%s:%d:ERROR: ", file, line); 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; struct utsname uts; char *cp; char caTag[32+1]; char *cpHost; int n; /* create remote address */ if (sa_addr_create(&ra) != SA_OK) die(DIE_MARK, "sa_addr_create (ra)"); if (sa_addr_u2a(ra, "inet://141.1.129.1:514") != SA_OK) die(DIE_MARK, "sa_addr_u2a (ra)"); /* create local address */ if (sa_addr_create(&la) != SA_OK) die(DIE_MARK, "sa_addr_create (la)"); if (sa_addr_u2a(la, "inet://0.0.0.0:0") != SA_OK) die(DIE_MARK, "sa_addr_u2a (la)"); /* create datagram socket */ if (sa_create(&sa) != SA_OK) die(DIE_MARK, "sa_create"); if (sa_type(sa, SA_TYPE_DATAGRAM) != SA_OK) die(DIE_MARK, "sa_type"); /* bind socket to local address */ if (sa_bind(sa, la) != SA_OK) die(DIE_MARK, "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) == -1) die(DIE_MARK, "uname"); cpHost = strdup(uts.nodename); if ((cp = strchr(cpHost, '.')) != NULL) *cp = '\0'; strcpy(caTag, "progname[12]: "); if (strlen(caTag) > 32) caTag[32] = '\0'; sprintf(caBuf, "<16>%s %s %s[%ld]: %s", caTime, cpHost, argv[0], (long)getpid(), "test for Internet Datagram socket"); fprintf(stderr, "Send to syslog: \"%s\"\n", caBuf); /* send message to syslogd(8) */ nBuf = strlen(caBuf); if (sa_send(sa, caBuf, nBuf, (size_t *)&n, ra) != SA_OK) die(DIE_MARK, "sa_writeto"); /* destroy socket and address objects */ if (sa_destroy(sa) != SA_OK) die(DIE_MARK, "sa_destroy"); if (sa_addr_destroy(la) != SA_OK) die(DIE_MARK, "sa_addr_destroy (la)"); if (sa_addr_destroy(ra) != SA_OK) die(DIE_MARK, "sa_addr_destroy (ra)"); return 0; }