#include <sys/types.h>
#include <mach/mach.h>
#include <mach/boolean.h>
#include <servers/bootstrap_defs.h>
#include <bsm/audit.h>
#ifndef NULL
#define NULL ((void *)0)
#endif NULL
typedef struct bootstrap bootstrap_info_t;
typedef struct service service_t;
typedef struct server server_t;
struct bootstrap {
bootstrap_info_t *next;
bootstrap_info_t *prev;
bootstrap_info_t *parent;
bootstrap_info_t *deactivate;
mach_port_name_t bootstrap_port;
mach_port_name_t requestor_port;
unsigned int ref_count;
};
typedef enum {
DECLARED,
REGISTERED
} servicetype_t;
struct service {
service_t *next;
service_t *prev;
name_t name;
mach_port_name_t port;
bootstrap_info_t *bootstrap;
boolean_t isActive;
servicetype_t servicetype;
server_t *server;
};
typedef enum {
SERVER,
RESTARTABLE,
DEMAND,
MACHINIT,
} servertype_t;
#define NULL_SERVER NULL
#define ACTIVE TRUE
struct server {
server_t *next;
server_t *prev;
servertype_t servertype;
cmd_t cmd;
uid_t uid;
auditinfo_t auinfo;
mach_port_t port;
mach_port_t task_port;
pid_t pid;
int activity;
int active_services;
bootstrap_info_t *bootstrap;
};
#define NO_PID (-1)
extern void init_lists(void);
extern server_t *new_server(
bootstrap_info_t *bootstrap,
const char *cmd,
uid_t uid,
servertype_t servertype,
auditinfo_t auinfo);
extern service_t *new_service(
bootstrap_info_t *bootstrap,
const char *name,
mach_port_t serviceport,
boolean_t isActive,
servicetype_t servicetype,
server_t *serverp);
extern bootstrap_info_t *new_bootstrap(
bootstrap_info_t *parent,
mach_port_name_t bootstrapport,
mach_port_name_t requestorport);
extern server_t *lookup_server_by_port(mach_port_t port);
extern server_t *lookup_server_by_task_port(mach_port_t port);
extern void setup_server(server_t *serverp);
extern void delete_server(server_t *serverp);
extern boolean_t active_server(server_t *serverp);
extern boolean_t useless_server(server_t *serverp);
extern void delete_service(service_t *servicep);
extern service_t *lookup_service_by_name(bootstrap_info_t *bootstrap, name_t name);
extern service_t *lookup_service_by_port(mach_port_t port);
extern service_t *lookup_service_by_server(server_t *serverp);
extern bootstrap_info_t *lookup_bootstrap_by_port(mach_port_t port);
extern bootstrap_info_t *lookup_bootstrap_by_req_port(mach_port_t port);
extern void deactivate_bootstrap(bootstrap_info_t *bootstrap);
extern void deallocate_bootstrap(bootstrap_info_t *bootstrap);
extern boolean_t active_bootstrap(bootstrap_info_t *bootstrap);
extern void *ckmalloc(unsigned nbytes);
extern bootstrap_info_t bootstraps;
extern server_t servers;
extern service_t services;
extern unsigned nservices;
#define FIRST(q) ((q).next)
#define NEXT(qe) ((qe)->next)
#define PREV(qe) ((qe)->prev)
#define IS_END(qe, q) ((qe) == &(q))