/* 
 * $Id: qcs_private.h,v 1.2 91/05/03 03:03:25 qjb Exp Locker: qjb $
 * $Source: /afs/athena.mit.edu/astaff/project/qcs/src/RCS/qcs_private.h,v $
 * $Author: qjb $
 *
 */

#ifndef __QCS_PRIVATE_H__
#define __QCS_PRIVATE_H__

#if !defined(lint) && !defined(SABER) || defined(RCS_HDRS)
static char *rcsid_qcs_private_h = "$Id: qcs_private.h,v 1.2 91/05/03 03:03:25 qjb Exp Locker: qjb $";
#endif /* !lint && !SABER || RCS_HDRS */

#include <sys/types.h>
#include <sys/param.h>
#include "qcs.h"


#ifndef FALSE
#define FALSE 0
#endif

#ifndef TRUE
#define TRUE 1
#endif


/* Seconds of idle time before being flushed */
#define QCS_FLUSHTIME 600

/* Seconds between status notifications */
#define QCS_NOTIFYTIME 30

/* Seconds between each periodic job check */
#define QCS_PERIODICTIME 10
/* Seconds between each periodic job on the client */
#define QCS_CLIENT_PERIODIC 3

#define QCS_NO_CMD_CLASS -1
#define QCS_READY 0
#define QCS_NOFORK -1
#define QCS_BACKLOG 5

/* Job types for qcsi_complete */
#define QCS_JT_FORK "Q"
#define QCS_JT_NOFORK "W"

#if defined(ibm032) || defined(vax) || defined(_AIX)
typedef int qcs_sigtype;
#else
typedef void qcs_sigtype;
#endif

typedef int qcs_cmd_class_id;

typedef enum {
    qf_unused = 0, 
    qf_completion,
    qf_listen, 
    qf_client
} qcs_fd_type;

#ifdef __STDC__
typedef void *qcs_pointer;
#else
typedef char *qcs_pointer;
#endif /* __STDC__ */

/*
 * Arbitrarily restrict the number of requests for each command class
 * to NOFILE.
 */

#define MAXREQUESTS NOFILE

typedef struct {
    long pid;
    qcs_cmd_desc *descs;
    qcs_request pending[MAXREQUESTS];
    int head;			/* Head of request queue */
    int tail;			/* Tail of request queue */
    int npending;		/* Number of requests pending */
} qcs_cmd_class;

typedef struct {
    /* Put data first for allignment reasons... */
    qcs_pointer data;
    qcs_fd_type fd_type;
} qcs_fd_function;


/* Function prototypes */

/* Server functions */

void qcsi_complete(char *);
void qcsi_mark_server_shutdown(qcs_client);
qcs_bool qcsi_is_server_shutdown(void);
qcs_error_t qcsi_assert_fd_type(int, char *, qcs_fd_type);
qcs_error_t qcsi_cmd_class_pid(int);
qcs_error_t qcsi_cmdcls_init(char *, qcs_cmd_desc **);
qcs_error_t qcsi_queue_request(qcs_cmd_class_id, 
				 qcs_client, qcs_cmd, qcs_jobno jobno);
qcs_error_t qcsi_dequeue_request(qcs_cmd_class_id,
				 qcs_request *);
char *qcsi_unparse_client(qcs_client);
void qcsi_log(char *);
void qcsi_error(int, char *, qcs_client);
void qcsi_debug(char *);
qcs_pointer qcsi_fd_data(int);
qcs_error_t qcsi_fd_init(char *);
qcs_fd_type qcsi_fd_type(int);
void qcsi_close_listener(void);
qcs_client qcsi_get_client_object(void);
qcs_cmd_class *qcsi_get_cmd_class(qcs_cmd_class_id);
void qcsi_handle_periodic(void);
void qcsi_handle_completion(int);
void qcsi_handle_connection(int);
void qcsi_handle_request(int);
void qcsi_init_aname_keyfile(char *, char *); 
void qcsi_init_read_fd_set(fd_set *);
int qcsi_max_fd(void);
void qcsi_register_fd(int, qcs_fd_type, qcs_pointer);
void qcsi_try_dispatch(qcs_cmd_class_id);
void qcsi_unregister_fd(int);
void qcsi_dump(void);
void qcsi_dump_fd_functions(void);
void qcsi_dump_cmd_classes(void);
qcs_client qcsi_get_client_from_req(qcs_request *);
void qcsi_notify_jobs(void);
qcs_error_t qcsi_show_idle_jobs(qcs_client, char *, char *, char *);
qcs_error_t qcsi_show_active_jobs(qcs_client, char *, char *, char *);
void qcsi_flush_idle_clients(void);
qcs_bool qcsi_no_vulnerable_clients(void);
char *qcsi_resolve_host(struct in_addr);
char *qcsi_unparse_cmd(qcs_cmd);
qcs_error_t qcsi_command_to_argv(char *, long *, char **, int *, char *);
qcs_dispatcher qcsi_get_dispatcher(qcs_cmd);
void qcsi_flush_client(qcs_client *);
qcs_error_t qcsi_client_notify(qcs_client, char *);
qcs_error_t qcsi_client_error(qcs_client, char *);
void qcsi_client_quit(qcs_client);
qcs_error_t qcsi_client_notify_completion(qcs_client, qcs_jobno);
void qcsi_get_command(qcs_client, qrpc_length_t);

/* Client functions */

qcs_error_t qcsi_handle_qcsserver(qcs_t *, void *); 
qcs_error_t qcsi_check_connection(qcs_t *, void *);
void qcsi_be_flushed(qcs_t *);

#endif /* __QCS_PRIVATE_H__ */
