commit proxychains-ng for openSUSE:Factory
Hello community, here is the log from the commit of package proxychains-ng for openSUSE:Factory checked in at 2015-05-29 10:41:18 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/proxychains-ng (Old) and /work/SRC/openSUSE:Factory/.proxychains-ng.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "proxychains-ng" Changes: -------- --- /work/SRC/openSUSE:Factory/proxychains-ng/proxychains-ng.changes 2015-01-08 23:01:25.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.proxychains-ng.new/proxychains-ng.changes 2015-05-29 10:41:19.000000000 +0200 @@ -1,0 +2,10 @@ +Thu May 28 07:29:41 UTC 2015 - nemysis@gmx.ch + +- Update to 4.9, announce message: + + - fix a security issue CVE-2015-3887 + - add sendto hook to handle MSG_FASTOPEN flag + - replace problematic hostentdb with hostsreader + - fix compilation on OpenBSD (although doesn't work there) + +------------------------------------------------------------------- Old: ---- proxychains-4.8.1.tar.bz2 New: ---- proxychains-4.9.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ proxychains-ng.spec ++++++ --- /var/tmp/diff_new_pack.pns8pm/_old 2015-05-29 10:41:20.000000000 +0200 +++ /var/tmp/diff_new_pack.pns8pm/_new 2015-05-29 10:41:20.000000000 +0200 @@ -1,7 +1,7 @@ # # spec file for package proxychains-ng # -# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: proxychains-ng -Version: 4.8.1 +Version: 4.9 Release: 0 Summary: Redirect connection through proxy servers License: GPL-2.0 ++++++ proxychains-4.8.1.tar.bz2 -> proxychains-4.9.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/COPYING new/proxychains-4.9/COPYING --- old/proxychains-4.8.1/COPYING 2014-07-22 17:23:21.000000000 +0200 +++ new/proxychains-4.9/COPYING 2015-05-28 08:36:44.000000000 +0200 @@ -1,8 +1,8 @@ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/Makefile new/proxychains-4.9/Makefile --- old/proxychains-4.8.1/Makefile 2014-07-22 17:23:21.000000000 +0200 +++ new/proxychains-4.9/Makefile 2015-05-28 08:36:44.000000000 +0200 @@ -18,14 +18,14 @@ LOBJS = src/nameinfo.o src/version.o \ src/core.o src/common.o src/libproxychains.o src/shm.o \ src/allocator_thread.o src/ip_type.o src/stringdump.o \ - src/hostentdb.o src/hash.o src/debug.o + src/hostsreader.o src/hash.o src/debug.o GENH = src/version.h CFLAGS += -Wall -O0 -g -std=c99 -D_GNU_SOURCE -pipe NO_AS_NEEDED = -Wl,--no-as-needed LIBDL = -ldl -LDFLAGS = -shared -fPIC $(NO_AS_NEEDED) $(LIBDL) -lpthread +LDFLAGS = -fPIC $(NO_AS_NEEDED) INC = PIC = -fPIC AR = $(CROSS_COMPILE)ar @@ -46,6 +46,7 @@ -include config.mak CFLAGS+=$(USER_CFLAGS) $(MAC_CFLAGS) +LDFLAGS+=$(USER_LDFLAGS) CFLAGS_MAIN=-DLIB_DIR=\"$(libdir)\" -DSYSCONFDIR=\"$(sysconfdir)\" -DDLL_NAME=\"$(LDSO_PATHNAME)\" @@ -81,10 +82,10 @@ $(CC) $(CPPFLAGS) $(CFLAGS) $(CFLAGS_MAIN) $(INC) $(PIC) -c -o $@ $< $(LDSO_PATHNAME): $(LOBJS) - $(CC) $(LDFLAGS) $(LD_SET_SONAME)$(LDSO_PATHNAME) -o $@ $(LOBJS) + $(CC) -shared $(LDFLAGS) $(LD_SET_SONAME)$(LDSO_PATHNAME) -lpthread $(LIBDL) -o $@ $(LOBJS) $(ALL_TOOLS): $(OBJS) - $(CC) src/main.o src/common.o -o $(PXCHAINS) + $(CC) $(LDFLAGS) src/main.o src/common.o -o $(PXCHAINS) .PHONY: all clean install install-config install-libs install-tools diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/README new/proxychains-4.9/README --- old/proxychains-4.8.1/README 2014-07-22 17:23:21.000000000 +0200 +++ new/proxychains-4.9/README 2015-05-28 08:36:44.000000000 +0200 @@ -1,4 +1,4 @@ -ProxyChains-NG ver 4.8 README +ProxyChains-NG ver 4.9 README ============================= ProxyChains is a UNIX program, that hooks network-related libc functions @@ -52,6 +52,12 @@ Changelog: ---------- +Version 4.9 +- fix a security issue CVE-2015-3887 +- add sendto hook to handle MSG_FASTOPEN flag +- replace problematic hostentdb with hostsreader +- fix compilation on OpenBSD (although doesn't work there) + Version 4.8.1: - fix regression in 4.8 install-config Makefile target @@ -69,9 +75,11 @@ - return EBADF rather than EINTR in close hook. it's legal for a program to retry close() calls when they receive EINTR, which could cause an infinite loop, as seen in chromium. + Version 4.6: - some cosmetic fixes to Makefile, fix a bug when non-numeric ip was - user as proxy server address. + used as proxy server address. + Version 4.5: - hook close() to prevent OpenSSH from messing with internal infrastructure. this caused ssh client to segfault when proxified. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/VERSION new/proxychains-4.9/VERSION --- old/proxychains-4.8.1/VERSION 2014-07-22 17:23:21.000000000 +0200 +++ new/proxychains-4.9/VERSION 2015-05-28 08:36:44.000000000 +0200 @@ -1 +1 @@ -4.8.1 +4.9 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/configure new/proxychains-4.9/configure --- old/proxychains-4.8.1/configure 2014-07-22 17:23:21.000000000 +0200 +++ new/proxychains-4.9/configure 2015-05-28 08:36:44.000000000 +0200 @@ -14,6 +14,10 @@ uname -s | grep BSD >/dev/null } +isopenbsd() { + uname -s | grep OpenBSD >/dev/null +} + usage() { echo "supported arguments" echo "--prefix=/path default: $prefix" @@ -22,6 +26,9 @@ echo "--libdir=/path default: $prefix/lib" echo "--includedir=/path default: $prefix/include" echo "--sysconfdir=/path default: $prefix/etc" + echo "--ignore-cve default: no" + echo " if set to yes ignores CVE-2015-3887 and makes it possible" + echo " to preload from current dir (insecure)" ismac && isx86_64 && echo "--fat-binary : build for both i386 and x86_64 architectures on 64-bit Macs" echo "--help : show this text" exit 1 @@ -35,7 +42,7 @@ } fat_binary= - +ignore_cve=no parsearg() { case "$1" in --prefix=*) prefix=`spliteq $1`;; @@ -44,6 +51,8 @@ --libdir=*) libdir=`spliteq $1`;; --includedir=*) includedir=`spliteq $1`;; --sysconfdir=*) sysconfdir=`spliteq $1`;; + --ignore-cve) ignore_cve=1;; + --ignore-cve=*) ignore_cve=`spliteq $1`;; --fat-binary) fat_binary=1;; --help) usage;; esac @@ -83,12 +92,14 @@ echo CC?=$CC>config.mak [ -z "$CPPFLAGS" ] || echo CPPFLAGS?=$CPPFLAGS>>config.mak [ -z "$CFLAGS" ] || echo USER_CFLAGS?=$CFLAGS>>config.mak +[ -z "$LDFLAGS" ] || echo USER_LDFLAGS?=$LDFLAGS>>config.mak echo prefix=$prefix>>config.mak echo exec_prefix=$exec_prefix>>config.mak echo bindir=$bindir>>config.mak echo libdir=$libdir>>config.mak echo includedir=$includedir>>config.mak echo sysconfdir=$sysconfdir>>config.mak +[ "$ignore_cve" = "no" ] && echo CPPFLAGS+= -DSUPER_SECURE>>config.mak make_cmd=make if ismac ; then echo NO_AS_NEEDED=>>config.mak @@ -103,6 +114,7 @@ elif isbsd ; then echo LIBDL=>>config.mak echo "CFLAGS+=-DIS_BSD">>config.mak + isopenbsd && echo "CFLAGS+=-DIS_OPENBSD">>config.mak make_cmd=gmake fi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/src/core.c new/proxychains-4.9/src/core.c --- old/proxychains-4.8.1/src/core.c 2014-07-22 17:23:21.000000000 +0200 +++ new/proxychains-4.9/src/core.c 2015-05-28 08:36:44.000000000 +0200 @@ -719,11 +719,7 @@ return -1; } -#include "hostentdb.h" -struct hostent_list hl; - void core_initialize(void) { - hdb_init(&hl); } void core_unload(void) { @@ -734,6 +730,7 @@ data->hostent_space.h_name = data->addr_name; } +extern ip_type hostsreader_get_numeric_ip_for_name(const char* name); struct hostent *proxy_gethostbyname(const char *name, struct gethostbyname_data* data) { PFUNC(); char buff[256]; @@ -758,10 +755,8 @@ goto retname; } - memset(buff, 0, sizeof(buff)); - // this iterates over the "known hosts" db, usually /etc/hosts - ip_type hdb_res = hdb_get(&hl, (char*) name); + ip_type hdb_res = hostsreader_get_numeric_ip_for_name(name); if(hdb_res.as_int != ip_type_invalid.as_int) { data->resolved_addr = hdb_res.as_int; goto retname; @@ -790,8 +785,12 @@ free(res); } -#ifdef IS_MAC -/* getservbyname on mac is using thread local storage, so we dont need mutex */ +#if defined(IS_MAC) || defined(IS_OPENBSD) +#ifdef IS_OPENBSD /* OpenBSD has its own incompatible getservbyname_r */ +#define getservbyname_r mygetservbyname_r +#endif +/* getservbyname on mac is using thread local storage, so we dont need mutex + TODO: check if the same applies to OpenBSD */ static int getservbyname_r(const char* name, const char* proto, struct servent* result_buf, char* buf, size_t buflen, struct servent** result) { PFUNC(); @@ -858,6 +857,9 @@ p->ai_flags = hints->ai_flags; p->ai_protocol = hints->ai_protocol; } else { +#ifndef AI_V4MAPPED +#define AI_V4MAPPED 0 +#endif p->ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/src/core.h new/proxychains-4.9/src/core.h --- old/proxychains-4.8.1/src/core.h 2014-07-22 17:23:21.000000000 +0200 +++ new/proxychains-4.9/src/core.h 2015-05-28 08:36:44.000000000 +0200 @@ -95,6 +95,10 @@ typedef int (*getnameinfo_t) (const struct sockaddr *, socklen_t, char *, socklen_t, char *, socklen_t, int); +typedef ssize_t (*sendto_t) (int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *dest_addr, socklen_t addrlen); + + extern connect_t true_connect; extern gethostbyname_t true_gethostbyname; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/src/hostentdb.c new/proxychains-4.9/src/hostentdb.c --- old/proxychains-4.8.1/src/hostentdb.c 2014-07-22 17:23:21.000000000 +0200 +++ new/proxychains-4.9/src/hostentdb.c 1970-01-01 01:00:00.000000000 +0100 @@ -1,63 +0,0 @@ -#include <stdint.h> -#include <string.h> -#include <netdb.h> -#include <stdlib.h> -#include <netinet/in.h> -#include <sys/socket.h> - -#include "ip_type.h" -#include "hash.h" -#include "stringdump.h" -#include "hostentdb.h" -#include "common.h" -#include "debug.h" - -#define STEP 16 -static void hdb_add(struct hostent_list* hl, char* host, ip_type ip) { - if(hl->count +1 > hl->capa) { - void * nu = realloc(hl->entries, (hl->capa + STEP) * sizeof(struct hostent_entry)); - if(!nu) return; - hl->entries = nu; - hl->capa += STEP; - } - struct hostent_entry *h = &hl->entries[hl->count]; - h->hash = dalias_hash(host); - h->ip.as_int = ip.as_int; - h->str = dumpstring(host, strlen(host) + 1); - if(h->str) hl->count++; -} - -static void hdb_fill(struct hostent_list *hl) { -#ifndef IS_BSD - struct hostent* hp; - while((hp = gethostent())) - if(hp->h_addrtype == AF_INET && hp->h_length == sizeof(in_addr_t)) { - hdb_add(hl, hp->h_name, (ip_type) { .as_int = *((in_addr_t*)(hp->h_addr_list[0])) }); - } -#else - /* FreeBSD hangs on gethostent(). since this feature is not crucial, we just do nothing */ - (void) hl; -#endif -} - -void hdb_init(struct hostent_list *hl) { - memset(hl, 0, sizeof *hl); - hdb_fill(hl); -} - -ip_type hdb_get(struct hostent_list *hl, char* host) { - size_t i; - PFUNC(); - uint32_t hash = dalias_hash(host); - for(i = 0; i < hl->count; i++) { - if(hl->entries[i].hash == hash && !strcmp(hl->entries[i].str, host)) { - #ifdef DEBUG - char ipbuf[16]; - pc_stringfromipv4(hl->entries[i].ip.octet, ipbuf); - PDEBUG("got ip %s for hostent entry %s\n", ipbuf, host); - #endif - return hl->entries[i].ip; - } - } - return ip_type_invalid; -} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/src/hostentdb.h new/proxychains-4.9/src/hostentdb.h --- old/proxychains-4.8.1/src/hostentdb.h 2014-07-22 17:23:21.000000000 +0200 +++ new/proxychains-4.9/src/hostentdb.h 1970-01-01 01:00:00.000000000 +0100 @@ -1,23 +0,0 @@ -#ifndef HOSTENTDB_H -#define HOSTENTDB_H - -#include "ip_type.h" -#include <unistd.h> - -struct hostent_entry { - uint32_t hash; - ip_type ip; - char* str; -}; - -struct hostent_list { - size_t count; - size_t capa; - struct hostent_entry *entries; -}; - -void hdb_init(struct hostent_list *hl); -ip_type hdb_get(struct hostent_list *hl, char* host); - -//RcB: DEP "hostendb.c" -#endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/src/hostsreader.c new/proxychains-4.9/src/hostsreader.c --- old/proxychains-4.8.1/src/hostsreader.c 1970-01-01 01:00:00.000000000 +0100 +++ new/proxychains-4.9/src/hostsreader.c 2015-05-28 08:36:44.000000000 +0200 @@ -0,0 +1,121 @@ +#include <stdio.h> +#include <ctype.h> +#include <string.h> + +/* + simple reader for /etc/hosts + it only supports comments, blank lines and lines consisting of an ipv4 hostname pair. + this is required so we can return entries from the host db without messing up the + non-thread-safe state of libc's gethostent(). + +*/ + +struct hostsreader { + FILE *f; + char* ip, *name; +}; + +int hostsreader_open(struct hostsreader *ctx) { + if(!(ctx->f = fopen("/etc/hosts", "r"))) return 0; + return 1; +} + +void hostsreader_close(struct hostsreader *ctx) { + fclose(ctx->f); +} + +static int isnumericipv4(const char* ipstring); +int hostsreader_get(struct hostsreader *ctx, char* buf, size_t bufsize) { + while(1) { + if(!fgets(buf, bufsize, ctx->f)) return 0; + if(*buf == '#') continue; + char *p = buf; + size_t l = bufsize; + ctx->ip = p; + while(*p && !isspace(*p) && l) { + p++; + l--; + } + if(!l || !*p || p == ctx->ip) continue; + *p = 0; + p++; + while(*p && isspace(*p) && l) { + p++; + l--; + } + if(!l || !*p) continue; + ctx->name = buf; + while(*p && !isspace(*p) && l) { + p++; + l--; + } + if(!l || !*p) continue; + *p = 0; + if(isnumericipv4(ctx->ip)) return 1; + } +} + +char* hostsreader_get_ip_for_name(const char* name, char* buf, size_t bufsize) { + struct hostsreader ctx; + char *res = 0; + if(!hostsreader_open(&ctx)) return 0; + while(hostsreader_get(&ctx, buf, bufsize)) { + if(!strcmp(ctx.name, name)) { + res = ctx.ip; + break; + } + } + hostsreader_close(&ctx); + return res; +} + +#include "ip_type.h" +#include <netinet/in.h> +#include <sys/socket.h> +#include <arpa/inet.h> +ip_type hostsreader_get_numeric_ip_for_name(const char* name) { + char *hres; + char buf[320]; + if((hres = hostsreader_get_ip_for_name(name, buf, sizeof buf))) { + struct in_addr c; + inet_aton(hres, &c); + ip_type res; + memcpy(res.octet, &c.s_addr, 4); + return res; + } else return ip_type_invalid; +} + +#ifdef HOSTSREADER_TEST +int main() { + char buf[256]; + char * ret = hostsreader_get_ip_for_name("goo", buf, sizeof buf); + printf("%s\n", ret ? ret : "null"); +} +#endif + +/* isnumericipv4() taken from libulz */ +static int isnumericipv4(const char* ipstring) { + size_t x = 0, n = 0, d = 0; + int wasdot = 0; + while(1) { + switch(ipstring[x]) { + case 0: goto done; + case '.': + if(!n || wasdot) return 0; + d++; + wasdot = 1; + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + n++; + wasdot = 0; + break; + default: + return 0; + } + x++; + } + done: + if(d == 3 && n >= 4 && n <= 12) return 1; + return 0; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/src/libproxychains.c new/proxychains-4.9/src/libproxychains.c --- old/proxychains-4.8.1/src/libproxychains.c 2014-07-22 17:23:21.000000000 +0200 +++ new/proxychains-4.9/src/libproxychains.c 2015-05-28 08:36:44.000000000 +0200 @@ -52,6 +52,7 @@ freeaddrinfo_t true_freeaddrinfo; getnameinfo_t true_getnameinfo; gethostbyaddr_t true_gethostbyaddr; +sendto_t true_sendto; int tcp_read_time_out; int tcp_connect_time_out; @@ -113,6 +114,7 @@ proxychains_write_log(LOG_PREFIX "DLL init: proxychains-ng %s\n", proxychains_get_version()); SETUP_SYM(connect); + SETUP_SYM(sendto); SETUP_SYM(gethostbyname); SETUP_SYM(getaddrinfo); SETUP_SYM(freeaddrinfo); @@ -479,3 +481,20 @@ } return NULL; } + +#ifndef MSG_FASTOPEN +# define MSG_FASTOPEN 0x20000000 +#endif + +ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *dest_addr, socklen_t addrlen) { + if (flags & MSG_FASTOPEN) { + if (!connect(sockfd, dest_addr, addrlen) && errno != EINPROGRESS) { + return -1; + } + dest_addr = NULL; + addrlen = 0; + flags &= ~MSG_FASTOPEN; + } + return true_sendto(sockfd, buf, len, flags, dest_addr, addrlen); +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/src/main.c new/proxychains-4.9/src/main.c --- old/proxychains-4.8.1/src/main.c 2014-07-22 17:23:21.000000000 +0200 +++ new/proxychains-4.9/src/main.c 2015-05-28 08:36:44.000000000 +0200 @@ -33,7 +33,9 @@ static char own_dir[256]; static const char *dll_dirs[] = { +#ifndef SUPER_SECURE /* CVE-2015-3887 */ ".", +#endif own_dir, LIB_DIR, "/lib", @@ -48,7 +50,11 @@ while(l && argv0[l - 1] != '/') l--; if(l == 0) +#ifdef SUPER_SECURE + memcpy(own_dir, "/dev/null/", 11); +#else memcpy(own_dir, ".", 2); +#endif else { memcpy(own_dir, argv0, l - 1); own_dir[l] = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/proxychains-4.8.1/tests/test_sendto.c new/proxychains-4.9/tests/test_sendto.c --- old/proxychains-4.8.1/tests/test_sendto.c 1970-01-01 01:00:00.000000000 +0100 +++ new/proxychains-4.9/tests/test_sendto.c 2015-05-28 08:36:44.000000000 +0200 @@ -0,0 +1,66 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netdb.h> + +#ifndef MSG_FASTOPEN +# define MSG_FASTOPEN 0x20000000 +#endif + +void error(const char *msg) +{ + perror(msg); + exit(1); +} + +int main(int argc, char *argv[]) +{ + if (argc < 4) { + printf("Usage: %s host port method(connect or sendto)\n", argv[0]); + return 1; + } + const char *hostname = argv[1]; + const int portno = atoi(argv[2]); + const char *method = argv[3]; + char request[BUFSIZ]; + sprintf(request, "GET / HTTP/1.0\r\nHost: %s\r\n\r\n", hostname); + int sockfd, n; + struct sockaddr_in serv_addr; + struct hostent *server; + + char buffer[BUFSIZ]; + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) error("ERROR opening socket"); + server = gethostbyname(hostname); + if (server == NULL) { + fprintf(stderr, "%s: no such host\n", hostname); + return 1; + } + memset(&serv_addr, 0, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + memcpy(&serv_addr.sin_addr.s_addr, server->h_addr, server->h_length); + serv_addr.sin_port = htons(portno); + if (!strcmp(method, "connect")) { + if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) + error("connect"); + n = send(sockfd, request, strlen(request), 0); + } else if (!strcmp(method, "sendto")) { + n = sendto(sockfd, request, strlen(request), MSG_FASTOPEN, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); + } else { + printf("Unknown method %s\n", method); + return 1; + } + if (n < 0) + error("send"); + memset(buffer, 0, BUFSIZ); + n = read(sockfd, buffer, BUFSIZ - 1); + if (n < 0) + error("ERROR reading from socket"); + printf("%s\n", buffer); + close(sockfd); + return 0; +}
participants (1)
-
root@hilbert.suse.de