ftp.nice.ch/pub/next/unix/network/system/gated.2.1pl2.NI.bs.tar.gz#/gated-2.1/src/task.h

This is task.h in view mode; [Download] [Up]

/*
 * $Header: /disk/d/src/devel/gated/dist/src/RCS/task.h,v 2.1 92/02/24 14:13:06 jch Exp $
 */

/*%Copyright%*/
/************************************************************************
*									*
*	GateD, Release 2						*
*									*
*	Copyright (c) 1990,1991,1992 by Cornell University		*
*	    All rights reserved.					*
*									*
*	THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY		*
*	EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT		*
*	LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY		*
*	AND FITNESS FOR A PARTICULAR PURPOSE.				*
*									*
*	Royalty-free licenses to redistribute GateD Release		*
*	2 in whole or in part may be obtained by writing to:		*
*									*
*	    GateDaemon Project						*
*	    Information Technologies/Network Resources			*
*	    143 Caldwell Hall						*
*	    Cornell University						*
*	    Ithaca, NY 14853-2602					*
*									*
*	GateD is based on Kirton's EGP, UC Berkeley's routing		*
*	daemon	 (routed), and DCN's HELLO routing Protocol.		*
*	Development of Release 2 has been supported by the		*
*	National Science Foundation.					*
*									*
*	Please forward bug fixes, enhancements and questions to the	*
*	gated mailing list: gated-people@gated.cornell.edu.		*
*									*
*	Authors:							*
*									*
*		Jeffrey C Honig <jch@gated.cornell.edu>			*
*		Scott W Brim <swb@gated.cornell.edu>			*
*									*
*************************************************************************
*									*
*      Portions of this software may fall under the following		*
*      copyrights:							*
*									*
*	Copyright (c) 1988 Regents of the University of California.	*
*	All rights reserved.						*
*									*
*	Redistribution and use in source and binary forms are		*
*	permitted provided that the above copyright notice and		*
*	this paragraph are duplicated in all such forms and that	*
*	any documentation, advertising materials, and other		*
*	materials related to such distribution and use			*
*	acknowledge that the software was developed by the		*
*	University of California, Berkeley.  The name of the		*
*	University may not be used to endorse or promote		*
*	products derived from this software without specific		*
*	prior written permission.  THIS SOFTWARE IS PROVIDED		*
*	``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,	*
*	INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF	*
*	MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.		*
*									*
************************************************************************/


#define	TASK_TIMERS	5		/* Number of timers per task */

/* Task definitions */

struct _task {
    struct _task *task_forw;
    struct _task *task_back;
    const char *task_name;		/* Printable task name */
    flag_t task_flags;			/* Flags */
    int task_proto;			/* Protocol */
    int task_socket;			/* Socket (if applicable) */
    proto_t task_rtproto;		/* Routing table protocol (if applicable) */
    u_long task_rtrevision;		/* Revision level this task is up to */
    void (*task_recv) ();		/* Routine to receive packets (if applicable) */
    void (*task_accept) ();		/* Routine to process accepts (if applicable) */
    void (*task_write) ();		/* Routine to write when socket is ready */
    void (*task_connect) ();		/* Routine to process connect completions */
    void (*task_except) ();		/* Routine to handle exceptions */
    void (*task_terminate) ();		/* Routine to terminate task */
    void (*task_flash) ();		/* Routine to do flash updates */
    void (*task_ifchange) ();		/* Routine to call when an interface status changes */
    void (*task_cleanup) ();		/* Routine to cleanup before config file is re-read */
    void (*task_reinit) ();		/* Routine to cleanup after config file is re-read */
    void (*task_dump) ();		/* Routine to dump state */
    sockaddr_un task_addr;		/* Task dependent address */
    caddr_t task_data;			/* Task dependent pointer */

    int task_pid;			/* PID if this is a child */
    void (*task_process) ();		/* Routine to run after fork */
    void (*task_child) ();		/* Routine to run after child finishes */

    struct _timer *task_timer[TASK_TIMERS];	/* Pointer to timers this task owns */

};

#define	TASKF_ACCEPT		0x01	/* This socket is waiting for accepts, not reads */
#define	TASKF_CONNECT		0x02	/* This socket is waiting for connects, not writes */
#define	TASKF_IPHEADER		0x04	/* Received packets have IP header to be received */

#define	TASKOPTION_RECVBUF	0	/* Set receive buffer size */
#define	TASKOPTION_SENDBUF	1	/* Set send buffer size */
#define	TASKOPTION_LINGER	2	/* Set TCP linger on close */
#define	TASKOPTION_REUSEADDR	3	/* Enable/disable address reuse */
#define	TASKOPTION_BROADCAST	4	/* Enable/disable broadcast use */
#define	TASKOPTION_DONTROUTE	5	/* Enable/disable don't route */
#define	TASKOPTION_KEEPALIVE	6	/* Enable/disable keepalives */
#define	TASKOPTION_DEBUG	7	/* Enable/disable socket level debugging */
#define	TASKOPTION_NONBLOCKING	8	/* Enable/disable non-blocking I/O */
#define	TASKOPTION_USELOOPBACK	9

extern char *task_path_name;

#ifdef	USE_PROTOTYPES
extern task *task_alloc(const char *name);
extern int
task_create(task * tp,
	    int maxsize);
extern int task_fork(task * tp);
extern void task_delete(task * tp);
extern void task_init(void);
extern void task_main(void);
extern void task_flash(task * tp);
extern void task_ifchange(if_entry * ifp);
extern void
task_toall(task * tp,
	   void (*func) (),
	   int point_to_point,
	   int if_flag,
	   gw_entry * gw_list,
	   int flash_update);
extern int task_set_option(task * tp, int option, caddr_t value);
extern int task_get_socket(int domain, int type, int protocol);
extern void task_set_socket(task * tp, int socket);
extern void task_reset_socket(task * tp);
extern char *task_name(task * tp);
extern void task_dump(FILE * fd);
extern int task_receive_packet(task * tp, int *count);
extern int task_send_packet(task * tp, caddr_t msg, int len, flag_t flags, sockaddr_un * addr);

extern char *task_getwd(void);
extern int task_chdir(char *);
extern void task_getpaths(void);
#else				/* USE_PROTOTYPES */
extern task *task_alloc();
extern int task_create();
extern int task_fork();
extern void task_delete();
extern void task_init();
extern void task_main();
extern void task_flash();
extern void task_ifchange();
extern void task_toall();
extern int task_set_option();
extern int task_get_socket();
extern void task_set_socket();
extern void task_reset_socket();
extern char *task_name();
extern void task_dump();
extern int task_receive_packet();
extern int task_send_packet();

extern char *task_getwd();
extern int task_chdir();
extern void task_getpaths();
#endif				/* USE_PROTOTYPES */

#define	TASK_TABLE(tp)	{ task *_tp; \
			      for (tp = task_head.task_forw; _tp = tp->task_back, tp != &task_head; \
				   tp = (tp == _tp->task_forw) ? tp->task_forw : _tp->task_forw )
#define TASK_TABLEEND(tp)	}

/*  */
/* Timer definitions */

struct _timer {
    struct _timer *timer_forw;
    struct _timer *timer_back;
    const char *timer_name;		/* Printable name for this timer */
    flag_t timer_flags;			/* Flags */
    time_t timer_next_time;		/* Timer job wakeup time */
    time_t timer_last_time;		/* Last time job was called */
    time_t timer_interval;		/* Time to sleep between timer jobs */
    void (*timer_job) ();		/* Timer job (if applicable) */
    task *timer_task;			/* Task which owns this timer */
    int timer_index;			/* Index of this timer in task's table */
};

/* Timer flags */

#define	TIMERF_ABSOLUTE		0x01	/* Timer is relative to start time, not to last time */
#define	TIMERF_DELETE		0x02	/* Delete timer after it fires */

#ifdef	USE_PROTOTYPES
extern char *timer_name(timer * tip);	/* Return a string containing the name of a timer */
extern timer *
timer_create(task * tp,
	     int timer_index,
	     const char *name,
	     flag_t flags,
	     time_t interval,
	     void (*job) ());		/* Create a timer */
extern void timer_delete(timer * tip);	/* Delete a timer */
extern void timer_set(timer * tip, time_t interval);	/* Set a timer */
extern void timer_reset(timer * tip);	/* Reset a timer (clear it) */
extern void timer_interval(timer * tip, time_t interval);	/* Change a timer interval */

#else				/* USE_PROTOTYPES */
extern char *timer_name();		/* Return a string containing the name of a timer */
extern timer *timer_create();		/* Create a timer */
extern void timer_delete();		/* Delete a timer */
extern void timer_set();		/* Set a timer */
extern void timer_reset();		/* Reset a timer (clear it) */
extern void timer_interval();		/* Change a timer interval */

#endif				/* USE_PROTOTYPES */

#define	TIMER_ACTIVE(tip) { timer *_tip; \
				for (tip = timer_queue_active.timer_forw; _tip = tip->timer_back, tip != &timer_queue_active; \
				     tip = (tip == _tip->timer_forw) ? tip->timer_forw : _tip->timer_forw)
#define TIMER_ACTIVEEND(tip)	}

#define	TIMER_INACTIVE(tip) { timer *_tip; \
				for (tip = timer_queue_inactive.timer_forw; _tip = tip->timer_back, tip != &timer_queue_inactive; \
				     tip = (tip == _tip->timer_forw) ? tip->timer_forw : _tip->timer_forw)
#define TIMER_INACTIVEEND(tip) }

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.