
/*
 *----------------------------------------------------------------------
 *
 * $Source: qc:c-src/common/misclib/rcs/s_socket.h,v $
 * $Revision: 1.3 $
 * $Date: 1993/10/02 19:34:25 $
 * $State: Exp $
 * $Author: alph $
 * $Locker:  $
 *
 *----------------------------------------------------------------------
 *
 * alph 
 * 
 * This code is (C) Copyright 1993 by Carsten Heyl. All rights reserved.
 * This code is NOT in the Public Domain.
 * It may be copied, modified or distributed as long as this notice is
 * present.
 *
 *----------------------------------------------------------------------
 * $Log: s_socket.h,v $
 * Revision 1.3  1993/10/02  19:34:25  alph
 * fixed sendto typo
 *
 */

#include <stdio.h>
#include <stdarg.h>
#include <fcntl.h>
#include <sys/types.h>
#include <proto/socket.h>

#define S_MAXFH 32 /* first socket descriptor */

#ifdef PRIVATE_SOCKET_H

#define _IOSOCK 0x1000 /* socket buffered io */

struct __iobufext {
    struct __iobufext *_next;
    unsigned char *_ptr;	/* current buffer pointer */
    int _rcnt;		        /* current byte count for reading */
    int _wcnt;		        /* current byte count for writing */
    unsigned char *_base;	/* base address of I/O buffer */
    int _size;			/* size of buffer */
    int _flag;	        	/* control flags */
    int _file;		        /* file descriptor */
    unsigned char _cbuff;	/* single char buffer */
};

typedef struct __iobufext FILEEXT;
#else
#define FILEEXT FILE

#define fclose s_fclose
#define fflush s_fflush
#define freopen s_freopen
#define setbuf s_setbuf
#define setvbuf s_setvbuf
#define fprintf s_fprintf
#define fscanf s_fscanf
#define vfprintf s_vfprintf

#define fgetc s_fgetc
#define fgets s_fgets
#define fputc s_fputc
#define fputs s_fputs
#ifdef getc
#undef getc
#endif
#define getc s_getc
#ifdef putc
#undef putc
#endif
#define putc s_putc

#define fread s_fread
#define fwrite s_fwrite
#define fgetpos s_fgetpos
#define fseek s_fseek
#define fsetpos s_fsetpos
#define ftell s_ftell
#ifndef rewind
#define rewind s_rewind
#endif
#ifndef clearerr
#define clearerr s_clearerr
#endif
#ifndef feof
#define feof s_feof
#endif
#ifndef ferror
#define ferror s_ferror
#endif
/* FIXME: #define perror s_perror */
#define fdopen s_fdopen

/* low level file stuff */
#undef write
#define write s_write
#undef read
#define read s_read
#undef close
#define close s_close
#undef lseek
#define lseek s_lseek
#undef tell
#define tell s_tell
#define isatty s_isatty
#define iomode s_iomode

/* socket stuff */
#define accept s_accept
#define bind s_bind
#define CloseSocket s_CloseSocket
#define connect s_connect
#define getpeername s_getpeername
#define getsockname s_getsockname
#define getsockopt s_getsockopt
#define setsockopt s_setsockopt
#define ioctl s_ioctl
#define listen s_listen
#define recv s_recv
#define recvfrom s_recvfrom
#ifdef select
#undef select
#endif
#define select s_select
#define WaitSelect s_WaitSelect
#define send s_send
#define sendto s_sendto
#define shutdown s_shutdown
#define socket s_socket
#define getdtablesize s_getdtablesize
#undef FD_SET
#define	FD_SET(n, p)	((p)->fds_bits[(n-S_MAXFH)/NFDBITS] |= (1 << ((n-S_MAXFH) % NFDBITS)))
#undef FD_CLR
#define	FD_CLR(n, p)	((p)->fds_bits[(n-S_MAXFH)/NFDBITS] &= ~(1 << ((n-S_MAXFH) % NFDBITS)))
#undef FD_ISSET
#define	FD_ISSET(n, p)	((p)->fds_bits[(n-S_MAXFH)/NFDBITS] & (1 << ((n-S_MAXFH) % NFDBITS)))
#endif

#define s_getc(p) \
        (((p)->_flag & _IOREAD) ? \
            (--(p)->_rcnt >= 0 && ! ((p)->_file & _IORKEY) ? \
                *(p)->_ptr++ \
            : \
                s_fgetc(p)) \
        : \
            s_fgetc(p))

#define s_putc(c,p) \
        (((p)->_flag & _IOWRT) ? \
            (++(p)->_wcnt <= (p)->_size ? \
                ((((int) (*(p)->_ptr++ = ((unsigned char)(c)))) == '\n' && \
                   ((p)->_flag & _IOLBF)) ? \
                    s_fflush(p), ((unsigned char)(c)) \
                : \
                    ((unsigned char)(c))) \
            : \
                (--(p)->_wcnt,s_fputc(c,p))) \
        : \
             s_fputc(c,p))

/* s_socket.c */
FILE *s_fdopen ( int fd , const char *mode );
void s_fclose ( FILE *af );
size_t s_fread ( void *b , size_t bsize , size_t n , FILE *fp );
size_t s_fwrite ( void *b , size_t bsize , size_t n , FILE *fp );
int s_fgetc ( FILE *af );
int s_fflush ( FILEEXT *af );
int s_vfprintf ( FILE *af , const char *fmt , va_list args );
int s_fprintf ( FILEEXT *af , const char *fmt , ...);
int s_ferror ( FILE *af );
int s_read ( int fh , void *buf , unsigned int len );
int s_write ( int fh , void *buf , unsigned int len );
int s_close ( int sd );



/* s_socket.c */
FILE *s_fdopen ( int fd , const char *mode );
void s_fclose ( FILE *af );
size_t s_fread ( void *b , size_t bsize , size_t n , FILE *fp );
size_t s_fwrite ( void *b , size_t bsize , size_t n , FILE *fp );
char *s_fgets ( char *b , int bsize , FILE *fp );
int s_fputs ( const char *b , FILE *fp );
int s_fseek ( FILE *fp , long rpos , int mode );
int s_fgetc ( FILE *af );
int s_fflush ( FILEEXT *af );
int s_vfprintf ( FILE *af , const char *fmt , va_list args );
int s_fprintf ( FILEEXT *af , const char *fmt , ...);
int s_fputc ( int c , FILEEXT *af );
int s_ferror ( FILE *af );
int s_read ( int fh , void *buf , unsigned int len );
int s_write ( int fh , void *buf , unsigned int len );
int s_close ( int sd );
int s_isatty ( int sd );
int s_iomode(int fd, int mode);
long s_lseek ( int sd , long a , int mode );
long s_accept ( long s , struct sockaddr *addr , int *addrlen );
long s_bind ( long s , struct sockaddr *name , long namelen );
long s_CloseSocket ( long sd );
long s_connect ( long s , struct sockaddr *name , long namelen );
long s_getpeername ( long s , struct sockaddr *name , int *namelen );
long s_getsockname ( long s , struct sockaddr *name , int *namelen );
long s_setsockopt ( long s , long level , long optname , caddr_t optval , long optlen );
long s_listen ( long s , long backlog );
long s_recv ( long s , char *buf , long len , long flags );
long s_recvfrom(long s, char *buf, long len, long flags, 
		struct sockaddr *from, long *len2);
long s_select ( long nfds , fd_set *readfds , fd_set *writefds , fd_set *exceptfds , struct timeval *timeout );
int s_send ( int s , char *msg , int len , int flags );
long s_shutdown ( long s , long how );
long s_socket ( long domain , long type , long protocol );
