aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/fetchmailnochda.pl
diff options
context:
space:
mode:
authorMatthias Andree <matthias.andree@gmx.de>2005-07-03 18:05:34 +0000
committerMatthias Andree <matthias.andree@gmx.de>2005-07-03 18:05:34 +0000
commit01b7a43454938bea76465632c6a7902c9637ac9d (patch)
tree7369ab7e6bc1adc4739d3dc3946ae8153ddc7bcb /contrib/fetchmailnochda.pl
parentd226f4d59684e885eb8ee39165be275274ba5e01 (diff)
downloadfetchmail-01b7a43454938bea76465632c6a7902c9637ac9d.tar.gz
fetchmail-01b7a43454938bea76465632c6a7902c9637ac9d.tar.bz2
fetchmail-01b7a43454938bea76465632c6a7902c9637ac9d.zip
Remove defines that we don't check (Miloslav Trmac).
svn path=/trunk/; revision=4067
Diffstat (limited to 'contrib/fetchmailnochda.pl')
0 files changed, 0 insertions, 0 deletions
' href='#n134'>134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
/*
 * socket.c -- socket library functions
 *
 * For license terms, see the file COPYING in this directory.
 */

#include <config.h>

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#if defined(STDC_HEADERS)
#include <stdlib.h>
#endif
#if defined(HAVE_UNISTD_H)
#include <unistd.h>
#endif
#if defined(HAVE_STDARG_H)
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include "socket.h"

#ifndef  INADDR_NONE
#ifdef   INADDR_BROADCAST
#define  INADDR_NONE	INADDR_BROADCAST
#else
#define	 INADDR_NONE	-1
#endif
#endif

FILE *Socket(char *host, int clientPort)
{
    int sock;
    unsigned long inaddr;
    struct sockaddr_in ad;
    struct hostent *hp;
    
    memset(&ad, 0, sizeof(ad));
    ad.sin_family = AF_INET;

    inaddr = inet_addr(host);
    if (inaddr != INADDR_NONE)
        memcpy(&ad.sin_addr, &inaddr, sizeof(inaddr));
    else
    {
        hp = gethostbyname(host);
        if (hp == NULL)
            return (FILE *)NULL;
        memcpy(&ad.sin_addr, hp->h_addr, hp->h_length);
    }
    ad.sin_port = htons(clientPort);
    
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0)
        return (FILE *)NULL;
    if (connect(sock, (struct sockaddr *) &ad, sizeof(ad)) < 0)
    {
	close(sock);
        return (FILE *)NULL;
    }
    return fdopen(sock, "r+");
}


#if defined(HAVE_STDARG_H)
int SockPrintf(FILE *sockfp, char* format, ...)
{
#else
int SockPrintf(sockfp,format,va_alist)
FILE *sockfp;
char *format;
va_dcl {
#endif

    va_list ap;
    char buf[8192];

#if defined(HAVE_STDARG_H)
    va_start(ap, format) ;
#else
    va_start(ap);
#endif
    vsprintf(buf, format, ap);
    va_end(ap);
    return SockWrite(buf, strlen(buf), sockfp);

}

/*
 * FIXME: This needs to be recoded to use stdio, if that's possible.
 *
 * If you think these functions are too slow and inefficient, you're
 * absolutely right.  I wish I could figure out what to do about it.
 * The ancestral popclient used static buffering here to cut down on the
 * number of read(2) calls, but we can't do that because we can have
 * two or more sockets open at a time.
 *
 * The right thing to do would be to use stdio for internal per-socket
 * buffering here (which is why Socket() returns a file pointer) but 
 * this causes mysterious lossage.  In case someone ever finds a way
 * around this, a note on Carl Harris's original implementation said:
 *
 * Size of buffer for internal buffering read function 
 * don't increase beyond the maximum atomic read/write size for
 * your sockets, or you'll take a potentially huge performance hit
 *
 * #define  INTERNAL_BUFSIZE	2048
 *
 */

int SockWrite(char *buf, int len, FILE *sockfp)
{
    int n, wrlen = 0;
    
    while (len)
    {
        n = write(fileno(sockfp), buf, len);
        if (n <= 0)
            return -1;
        len -= n;
	wrlen += n;
	buf += n;
    }
    return wrlen;
}

int SockGets(char *buf, int len, FILE *sockfp)
{
    int rdlen = 0;

    while (--len)
    {
        if (read(fileno(sockfp), buf, 1) != 1)
            return -1;
        else
	    rdlen++;
        if (*buf == '\n')
            break;
        if (*buf != '\r') /* remove all CRs */
            buf++;
    }
    *buf = 0;
    return rdlen;
}

/* socket.c ends here */