/*
 * The Spread Toolkit.
 *     
 * The contents of this file are subject to the Spread Open-Source
 * License, Version 1.0 (the ``License''); you may not use
 * this file except in compliance with the License.  You may obtain a
 * copy of the License at:
 *
 * http://www.spread.org/license/
 *
 * or in the file ``license.txt'' found in this distribution.
 *
 * Software distributed under the License is distributed on an AS IS basis, 
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
 * for the specific language governing rights and limitations under the 
 * License.
 *
 * The Creators of Spread are:
 *  Yair Amir, Michal Miskin-Amir, Jonathan Stanton.
 *
 *  Copyright (C) 1993-2004 Spread Concepts LLC <spread@spreadconcepts.com>
 *
 *  All Rights Reserved.
 *
 * Major Contributor(s):
 * ---------------
 *    Cristina Nita-Rotaru crisn@cs.purdue.edu - group communication security.
 *    Theo Schlossnagle    jesus@omniti.com - Perl, skiplists, autoconf.
 *    Dan Schoenblum       dansch@cnds.jhu.edu - Java interface.
 *    John Schultz         jschultz@cnds.jhu.edu - contribution to process group membership.
 *
 */

#ifndef INC_ARCH
#define INC_ARCH

/*
 * Each record in this file represents an architecture.
 * Each record contains the following fields:
 *
 *	#define		INTSIZE{16,32,64}
 *	#define		ARCH_SCATTER_{CONTROL,ACCRIGHTS,NONE}
 *	#define		ARCH_ENDIAN{0x00000000,0x80000080}
 *      #define         LOC_INLINE { __inline__ or blank }
 *      #define         ARCH_SCATTER_SIZE { sys dependent variable }
 *      #define         HAVE_GOOD_VARGS ( exists if true )
 *      #define         HAVE_LRAND48 ( exists if true )
 *      #define         HAVE_STDINT_H   ( exists if true --currently glibc2.1 needs it )
 *      typedef         {sys dependent type} sockopt_len_t;
 *      #define         ERR_TIMEDOUT    EAGAIN
 *      #define         sock_errno { errno or WSAGetLastError() for windows }
 *      #define         sock_strerror { strerror or sock_strerror for windows }
 *      #define         sock_set_errno { sock_unix_set_errno or WSASetLastError for windows }
 */

#undef          INTSIZE32
#undef          INTSIZE64
#undef          INTSIZE16


#ifndef ARCH_PC_WIN95
/* If we aren't using windows... we can use autoconf */

#include "config.h"


#ifdef WORDS_BIGENDIAN
#define         ARCH_ENDIAN     0x00000000
#else
#define		ARCH_ENDIAN	0x80000080
#endif
  
#define         LOC_INLINE      inline
  
/* Need to add special cases, SUNOS gets 64, IRIX gets 512 */  
#ifdef MSG_MAXIOVLEN
#define         ARCH_SCATTER_SIZE       MSG_MAXIOVLEN
#else
#define         ARCH_SCATTER_SIZE       1024
#endif

#define         HAVE_GOOD_VARGS
  
#ifndef ERR_TIMEDOUT
#define         ERR_TIMEDOUT    ETIMEDOUT
#endif
  
#ifndef RAND_MAX
#define         RAND_MAX        2147483647
#endif
  
#define         sock_errno      errno
#define         sock_strerror   strerror
#define         sock_set_errno(a)   (errno = (a)) 
  
#ifndef byte
#define byte u_int_8
#endif

#ifndef int16
#define int16 int16_t
#endif

#ifndef int16u
#define int16u u_int16_t
#endif

#ifndef int32
#define int32 int32_t
#endif

#ifndef int32u
#define int32u u_int32_t
#endif
  
#else
/* We are using windows... */
#define         INTSIZE32
#define		ARCH_SCATTER_NONE
#define		ARCH_ENDIAN	0x80000080
#define         LOC_INLINE      
typedef         unsigned long   sockopt_len_t;
typedef         unsigned long   socklen_t;
#define         BADCLOCK
#define         HAVE_GOOD_VARGS
/* This size is for packing several messages into one packet */
#define         ARCH_SCATTER_SIZE       64
#define         ERR_TIMEDOUT    EAGAIN
#define         sock_errno      WSAGetLastError()
#define         sock_strerror   sock_strerror
#define         sock_set_errno  WSASetLastError
#define         MAXPATHLEN      _MAX_PATH
#define         snprintf        _snprintf
#define         alloca          _alloca
/* Sockets are not file descriptors on windows so they need a special close function. */
#define         close           closesocket
/* Windows defines a default size of 64. However, the size of fd_set array for select
 * can be raised by defining a larger constant before including windows.h winsock.h
 */
#define         FD_SETSIZE      1024
/* System location of spread.conf file */
#define         SPREAD_ETCDIR   "/etc"
/* Use winsock constants since we are dealing with sockets
 * Note: If we ever need file IO with errno's we will have conflicts
 * since the WSA version and the basic E versions may not have the same
 * number. Right now we don't need the E versions for windows so we just
 * use the WSA versions.
 */
#undef EINTR
#undef EAGAIN
#undef EWOULDBLOCK
#undef EINPROGRESS
#define EWOULDBLOCK WSAEWOULDBLOCK
#define EINTR       WSAEINTR
#define EAGAIN      WSAEWOULDBLOCK
#define EINPROGRESS WSAEINPROGRESS

#ifndef int16
#define int16 short
#endif

#ifndef int16u
#define int16u unsigned short
#endif

#ifndef int32
#define int32 int
#endif

#ifndef int32u
#define int32u unsigned int
#endif

#ifndef UINT32_MAX
#define         UINT32_MAX      UINT_MAX
#endif
#ifndef INT32_MAX
#define         INT32_MAX       INT_MAX
#endif

/* Declare functions from arch.c */
char    *sock_strerror(int err);

#endif /* ARCH_PC_WIN95 */

/* Pick which rand version to use */
#ifdef HAVE_LRAND48
#define get_rand lrand48
#else
#define get_rand rand
#endif
  


#define         ENDIAN_TYPE             0x80000080

#define		Get_endian( type )	( (type) &  ENDIAN_TYPE )
#define		Set_endian( type )	( ( (type) & ~ENDIAN_TYPE )| ARCH_ENDIAN )
#define		Same_endian( type )	( ( (type) & ENDIAN_TYPE ) == ARCH_ENDIAN )
#define		Clear_endian( type )	( (type) & ~ENDIAN_TYPE )

#define		Flip_int16( type )	( ( ((type) >> 8) & 0x00ff) | ( ((type) << 8) & 0xff00) )

#define		Flip_int32( type )	( ( ((type) >>24) & 0x000000ff) | ( ((type) >> 8) & 0x0000ff00) | ( ((type) << 8) & 0x00ff0000) | ( ((type) <<24) & 0xff000000) )

#define		channel			int
#define		mailbox			int

typedef	struct	dummy_membership_id {
	int32	proc_id;
	int32	time;
} membership_id;

typedef struct	dummy_group_id {
	membership_id	memb_id;
	int32		index;
} group_id;

/* 
 * General Useful Types
 */

typedef         short           bool;
#ifndef TRUE
#define         TRUE            1
#endif
#ifndef FALSE
#define         FALSE           0
#endif

#endif	/* INC_ARCH */


syntax highlighted by Code2HTML, v. 0.9.1