/*
 * Message structure for load-poll
 */

typedef struct {
  int kind;                     /* Kind of message */
  int magic_number;             /* Magic number for authentication */
  union {
    struct {  int availability;                   /* Availability of host */
	      float loadfactor;                   /* Load index of host */
	    } load_info;
    struct {  int number_of_hosts;          /* Number of hosts requested
					     * from application resp. number
					     * of hosts returned from 
					     * load-manager */
	      /* Optional list of wanted hosts from application
	       * resp. list of returned from load-manager */
	      struct sockaddr_in list[MAXHOSTS]; 

	      float factor[MAXHOSTS];           /* Load index of host */
	      int avail[MAXHOSTS];              /* Availability of hosts */
	    } message;
    int errorcode;                              /* Error-code  */
    struct in_addr addr;
    int how;
  } data;

/* Possible values for the field `data.message.avail[]' */

#define HOST_DOWN -2           /* The host is down */
#define HOST_NOT_AVAIL -1      /* The host is not available */
#define HOST_AVAIL 0           /* The host is available */

#define data_avail        data.load_info.availability
#define data_load         data.load_info.loadfactor
#define data_factor       data.message.factor
#define data_number       data.message.number_of_hosts
#define data_hostlist     data.message.list
#define data_error        data.errorcode

} rpc_message;

/*
 * Structure for client authentication of rexec-manager
 */

/* Maximum number of groups a user can be in */
#define MAX_NUM_GROUPS          10


typedef struct {
  int kind;                      /* Kind of message */
  int magic_number;              /* Magic number of system */
  unsigned short port;                  /* Port given to rexec manager */
  int proc_nr;                   /* Process number given to rexec manager */
#ifdef WIN95
  SOCKET sock_nr;
#else
  int sock_nr;  /* Socket number on which the call was made */
#endif

#ifdef WIN32
  PSID ruid; 
PSID rgid;
/*BYTE rgid[LUSIZE];               /* Real user id */
/*BYTE rgid[LUSIZE];       /* Real group id */       
 
#endif
#ifdef UNIX
   unsigned short euid;                  /* Effective user id */
  unsigned short egid;                  /* Effective group id */
   unsigned short ruid;                  /*Real user id */
  unsigned short rgid;                  /* Real group id */
   int ngroups;                   /* Number of groups */
  int groups[MAX_NUM_GROUPS];    /* Groups the user is in */
#endif

} auth_request;


/*
 * Structure for reply of loaddaemon to above request
 */

typedef struct {
int kind;                         /* Kind of message */
int magic_number;                 /* Magic number of system */
int ok;                           /* Authentication ok? */
} auth_reply;

/*
 * Structure for request to read configuration file
 */

#if 0

/* XXX: not used. */

typedef struct {
	int kind;
	int magic_number;
	struct hostent host_ent;
} config_read_request;

/*
 * Structure for reply to above request
 */

typedef struct {
	int kind;
	int magic_number;
} config_read_reply;


typedef struct {
	int kind;
	int magic_number;
	int how;                    /* How to end (not used) */
} kill_request;

#endif
