367 lines
9.2 KiB
C
367 lines
9.2 KiB
C
/*********************************************************************
|
|
Project : GUSI - Grand Unified Socket Interface
|
|
File : GUSI.h - Socket calls
|
|
Author : Matthias Neeracher
|
|
Language : MPW C/C++
|
|
|
|
$Log$
|
|
Revision 1.1 1998/08/18 14:52:33 jack
|
|
Putting Python-specific GUSI modifications under CVS.
|
|
|
|
Revision 1.2 1994/12/31 01:45:54 neeri
|
|
Fix alignment.
|
|
|
|
Revision 1.1 1994/02/25 02:56:49 neeri
|
|
Initial revision
|
|
|
|
Revision 0.15 1993/06/27 00:00:00 neeri
|
|
f?truncate
|
|
|
|
Revision 0.14 1993/06/20 00:00:00 neeri
|
|
Changed sa_constr_ppc
|
|
|
|
Revision 0.13 1993/02/14 00:00:00 neeri
|
|
AF_PAP
|
|
|
|
Revision 0.12 1992/12/08 00:00:00 neeri
|
|
getcwd()
|
|
|
|
Revision 0.11 1992/11/15 00:00:00 neeri
|
|
remove netdb.h definitions
|
|
|
|
Revision 0.10 1992/09/26 00:00:00 neeri
|
|
Separate dirent and stat
|
|
|
|
Revision 0.9 1992/09/12 00:00:00 neeri
|
|
Hostname stuff
|
|
|
|
Revision 0.8 1992/09/07 00:00:00 neeri
|
|
readlink()
|
|
|
|
Revision 0.7 1992/08/03 00:00:00 neeri
|
|
sa_constr_ppc
|
|
|
|
Revision 0.6 1992/07/21 00:00:00 neeri
|
|
sockaddr_atlk_sym
|
|
|
|
Revision 0.5 1992/06/26 00:00:00 neeri
|
|
choose()
|
|
|
|
Revision 0.4 1992/05/18 00:00:00 neeri
|
|
PPC stuff
|
|
|
|
Revision 0.3 1992/04/27 00:00:00 neeri
|
|
getsockopt()
|
|
|
|
Revision 0.2 1992/04/19 00:00:00 neeri
|
|
C++ compatibility
|
|
|
|
Revision 0.1 1992/04/17 00:00:00 neeri
|
|
bzero()
|
|
|
|
*********************************************************************/
|
|
|
|
#ifndef _GUSI_
|
|
#define _GUSI_
|
|
|
|
#include <sys/types.h>
|
|
|
|
/* Feel free to increase FD_SETSIZE as needed */
|
|
#define GUSI_MAX_FD FD_SETSIZE
|
|
|
|
#include <sys/cdefs.h>
|
|
#include <compat.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/fcntl.h>
|
|
#include <sys/stat.h>
|
|
#include <dirent.h>
|
|
#include <Types.h>
|
|
#include <Events.h>
|
|
#include <Files.h>
|
|
#include <AppleTalk.h>
|
|
#include <CTBUtilities.h>
|
|
#include <Packages.h>
|
|
#include <PPCToolBox.h>
|
|
#include <StandardFile.h>
|
|
#include <stdio.h>
|
|
#include <sys/time.h>
|
|
#include <sys/socket.h>
|
|
#include <string.h>
|
|
#include <netinet/in.h>
|
|
#include <netdb.h>
|
|
#include <sys/un.h>
|
|
#include <unistd.h>
|
|
#include <machine/endian.h>
|
|
|
|
typedef enum spin_msg {
|
|
SP_MISC, /* some weird thing, usually just return immediately if you get this */
|
|
SP_SELECT, /* in a select call */
|
|
SP_NAME, /* getting a host by name */
|
|
SP_ADDR, /* getting a host by address */
|
|
SP_STREAM_READ, /* Stream read call */
|
|
SP_STREAM_WRITE, /* Stream write call */
|
|
SP_DGRAM_READ, /* Datagram read call */
|
|
SP_DGRAM_WRITE, /* Datagram write call */
|
|
SP_SLEEP, /* sleeping, passes ticks left to sleep */
|
|
SP_AUTO_SPIN /* Autospin, passes argument to SpinCursor */
|
|
} spin_msg;
|
|
|
|
typedef int (*GUSISpinFn)(spin_msg msg, long param);
|
|
typedef void (*GUSIEvtHandler)(EventRecord * ev);
|
|
typedef GUSIEvtHandler GUSIEvtTable[24];
|
|
|
|
/*
|
|
* Address families, defined in sys/socket.h
|
|
*
|
|
|
|
#define AF_UNSPEC 0 // unspecified
|
|
#define AF_UNIX 1 // local to host (pipes, portals)
|
|
#define AF_INET 2 // internetwork: UDP, TCP, etc.
|
|
#define AF_CTB 3 // Apple Comm Toolbox (not yet supported)
|
|
#define AF_FILE 4 // Normal File I/O (used internally)
|
|
#define AF_PPC 5 // PPC Toolbox
|
|
#define AF_PAP 6 // Printer Access Protocol (client only)
|
|
#define AF_APPLETALK 16 // Apple Talk
|
|
|
|
*/
|
|
|
|
#define ATALK_SYMADDR 272 /* Symbolic Address for AppleTalk */
|
|
|
|
/*
|
|
* Some Implementations of GUSI require you to call GUSISetup for the
|
|
* socket families you'd like to have defined. It's a good idea to call
|
|
* this for *all* implementations.
|
|
*
|
|
* GUSIDefaultSetup() will include all socket families.
|
|
*
|
|
* Never call any of the GUSIwithXXX routines directly.
|
|
*/
|
|
|
|
__BEGIN_DECLS
|
|
void GUSIwithAppleTalkSockets();
|
|
void GUSIwithInternetSockets();
|
|
void GUSIwithPAPSockets();
|
|
void GUSIwithPPCSockets();
|
|
void GUSIwithUnixSockets();
|
|
void GUSIwithSIOUXSockets();
|
|
void GUSIwithMPWSockets();
|
|
|
|
void GUSISetup(void (*socketfamily)());
|
|
void GUSIDefaultSetup();
|
|
void GUSILoadConfiguration(Handle);
|
|
__END_DECLS
|
|
/*
|
|
* Types, defined in sys/socket.h
|
|
*
|
|
|
|
#define SOCK_STREAM 1 // stream socket
|
|
#define SOCK_DGRAM 2 // datagram socket
|
|
|
|
*/
|
|
|
|
/*
|
|
* Defined in sys/un.h
|
|
*
|
|
|
|
struct sockaddr_un {
|
|
short sun_family;
|
|
char sun_path[108];
|
|
};
|
|
|
|
*/
|
|
|
|
#ifndef PRAGMA_ALIGN_SUPPORTED
|
|
#error Apple had some fun with the conditional macros again
|
|
#endif
|
|
|
|
#if PRAGMA_ALIGN_SUPPORTED
|
|
#pragma options align=mac68k
|
|
#endif
|
|
|
|
struct sockaddr_atlk {
|
|
short family;
|
|
AddrBlock addr;
|
|
};
|
|
|
|
struct sockaddr_atlk_sym {
|
|
short family;
|
|
EntityName name;
|
|
};
|
|
|
|
struct sockaddr_ppc {
|
|
short family;
|
|
LocationNameRec location;
|
|
PPCPortRec port;
|
|
};
|
|
|
|
/* Definitions for choose() */
|
|
|
|
#define CHOOSE_DEFAULT 1 /* Use *name as default name */
|
|
#define CHOOSE_NEW 2 /* Choose new entity name, not existing one */
|
|
#define CHOOSE_DIR 4 /* Choose a directory name, not a file */
|
|
|
|
typedef struct {
|
|
short numTypes;
|
|
SFTypeList types;
|
|
} sa_constr_file;
|
|
|
|
typedef struct {
|
|
short numTypes;
|
|
NLType types;
|
|
} sa_constr_atlk;
|
|
|
|
/* Definitions for sa_constr_ppc */
|
|
|
|
#define PPC_CON_NEWSTYLE 0x8000 /* Required */
|
|
#define PPC_CON_MATCH_NAME 0x0001 /* Match name */
|
|
#define PPC_CON_MATCH_TYPE 0x0002 /* Match port type */
|
|
#define PPC_CON_MATCH_NBP 0x0004 /* Match NBP type */
|
|
|
|
typedef struct {
|
|
short flags;
|
|
Str32 nbpType;
|
|
PPCPortRec match;
|
|
} sa_constr_ppc;
|
|
|
|
#if PRAGMA_ALIGN_SUPPORTED
|
|
#pragma options align=reset
|
|
#endif
|
|
|
|
__BEGIN_DECLS
|
|
/*
|
|
* IO/Socket stuff, defined elsewhere (unistd.h, sys/socket.h
|
|
*
|
|
|
|
int socket(int domain, int type, short protocol);
|
|
int bind(int s, void *name, int namelen);
|
|
int connect(int s, void *addr, int addrlen);
|
|
int listen(int s, int qlen);
|
|
int accept(int s, void *addr, int *addrlen);
|
|
int close(int s);
|
|
int read(int s, char *buffer, unsigned buflen);
|
|
int readv(int s, struct iovec *iov, int count);
|
|
int recv(int s, void *buffer, int buflen, int flags);
|
|
int recvfrom(int s, void *buffer, int buflen, int flags, void *from, int *fromlen);
|
|
int recvmsg(int s,struct msghdr *msg,int flags);
|
|
int write(int s, const char *buffer, unsigned buflen);
|
|
int writev(int s, struct iovec *iov, int count);
|
|
int send(int s, void *buffer, int buflen, int flags);
|
|
int sendto (int s, void *buffer, int buflen, int flags, void *to, int tolen);
|
|
int sendmsg(int s,struct msghdr *msg,int flags);
|
|
int select(int width, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
|
|
int getdtablesize(void);
|
|
int getsockname(int s, void *name, int *namelen);
|
|
int getpeername(int s, struct sockaddr *name, int *namelen);
|
|
int shutdown(int s, int how);
|
|
int fcntl(int s, unsigned int cmd, int arg);
|
|
int dup(int s);
|
|
int dup2(int s, int s1);
|
|
int ioctl(int d, unsigned int request, long *argp);
|
|
int getsockopt(int s, int level, int optname, char *optval, int * optlen);
|
|
int setsockopt(int s, int level, int optname, char *optval, int optlen);
|
|
int isatty(int);
|
|
int remove(const char *filename);
|
|
int rename(const char *oldname, const char *newname);
|
|
int creat(const char*);
|
|
int faccess(char*, unsigned int, long*);
|
|
long lseek(int, long, int);
|
|
int open(const char*, int);
|
|
int unlink(char*);
|
|
int symlink(char* linkto, char* linkname);
|
|
int readlink(char* path, char* buf, int bufsiz);
|
|
int truncate(char *path, long length);
|
|
int ftruncate(int fd, long length);
|
|
int chdir(char * path);
|
|
int mkdir(char * path);
|
|
int rmdir(char * path);
|
|
char * getcwd(char * buf, int size);
|
|
*/
|
|
|
|
/*
|
|
* Defined in stdio.h
|
|
*/
|
|
|
|
#ifdef __MWERKS__
|
|
void fsetfileinfo (char *filename, unsigned long newcreator, unsigned long newtype);
|
|
#endif
|
|
|
|
void fgetfileinfo (char *filename, unsigned long * creator, unsigned long * type);
|
|
|
|
#ifdef __MWERKS__
|
|
FILE *fdopen(int fd, const char *mode);
|
|
int fwalk(int (*func)(FILE * stream));
|
|
#endif
|
|
|
|
int choose(
|
|
int domain,
|
|
int type,
|
|
char * prompt,
|
|
void * constraint,
|
|
int flags,
|
|
void * name,
|
|
int * namelen);
|
|
|
|
/*
|
|
* Hostname routines, defined in netdb.h
|
|
*
|
|
|
|
struct hostent * gethostbyname(char *name);
|
|
struct hostent * gethostbyaddr(struct in_addr *addrP, int, int);
|
|
int gethostname(char *machname, long buflen);
|
|
struct servent * getservbyname (char * name, char * proto);
|
|
struct protoent * getprotobyname(char * name);
|
|
|
|
*/
|
|
|
|
char * inet_ntoa(struct in_addr inaddr);
|
|
struct in_addr inet_addr(char *address);
|
|
|
|
/*
|
|
* GUSI supports a number of hooks. Every one of them has a different prototype, but needs
|
|
* to be passed as a GUSIHook
|
|
*/
|
|
|
|
typedef enum {
|
|
GUSI_SpinHook, /* A GUSISpinFn, to be called when a call blocks */
|
|
GUSI_ExecHook, /* Boolean (*hook)(const GUSIFileRef & ref), decides if file is executable */
|
|
GUSI_FTypeHook,/* Boolean (*hook)(const FSSpec & spec) sets a default file type */
|
|
GUSI_SpeedHook /* A long integer, to be added to the cursor spin variable */
|
|
} GUSIHookCode;
|
|
|
|
typedef void (*GUSIHook)(void);
|
|
void GUSISetHook(GUSIHookCode code, GUSIHook hook);
|
|
GUSIHook GUSIGetHook(GUSIHookCode code);
|
|
|
|
/*
|
|
* What to do when a routine blocks
|
|
*/
|
|
|
|
/* Defined for compatibility */
|
|
#define GUSISetSpin(routine) GUSISetHook(GUSI_SpinHook, (GUSIHook)routine)
|
|
#define GUSIGetSpin() (GUSISpinFn) GUSIGetHook(GUSI_SpinHook)
|
|
|
|
int GUSISetEvents(GUSIEvtTable table);
|
|
GUSIEvtHandler * GUSIGetEvents(void);
|
|
|
|
extern GUSIEvtHandler GUSISIOWEvents[];
|
|
|
|
#define SIGPIPE 13
|
|
#define SIGALRM 14
|
|
|
|
/*
|
|
* BSD memory routines, defined in compat.h
|
|
*
|
|
|
|
#define index(a, b) strchr(a, b)
|
|
#define rindex(a, b) strrchr(a, b)
|
|
#define bzero(from, len) memset(from, 0, len)
|
|
#define bcopy(from, to, len) memcpy(to, from, len)
|
|
#define bcmp(s1, s2, len) memcmp(s1, s2, len)
|
|
#define bfill(from, len, x) memset(from, x, len)
|
|
|
|
*/
|
|
|
|
__END_DECLS
|
|
|
|
#endif /* !_GUSI_ */
|