home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2000 February
/
PCWorld_2000-02_cd.bin
/
live
/
usr
/
include
/
linux
/
kerneld.h.libc6
< prev
Wrap
Text File
|
1998-10-18
|
5KB
|
186 lines
#ifndef _LINUX_KERNELD_H
#define _LINUX_KERNELD_H
#define KERNELD_SYSTEM 1
#define KERNELD_REQUEST_MODULE 2 /* "insmod" */
#define KERNELD_RELEASE_MODULE 3 /* "rmmod" */
#define KERNELD_DELAYED_RELEASE_MODULE 4 /* "rmmod" */
#define KERNELD_CANCEL_RELEASE_MODULE 5 /* "rmmod" */
#define KERNELD_REQUEST_ROUTE 6 /* from net/ipv4/route.c */
#define KERNELD_BLANKER 7 /* from drivers/char/console.c */
#define KERNELD_PNP 8 /* from drivers/pnp/kerneld.c */
#define KERNELD_GET_PERSIST 200 /* persistent module storage */
#define KERNELD_SET_PERSIST 201 /* persistent module storage */
#define KERNELD_ARP 256 /* from net/ipv4/arp.c */
/*
* Uncomment the following line for the new kerneld protocol
* This includes the pid of the kernel level requester into the kerneld header
*/
/*
#define NEW_KERNELD_PROTOCOL
*/
#ifdef NEW_KERNELD_PROTOCOL
#define OLDIPC_KERNELD 00040000 /* use the kerneld message channel */
#define IPC_KERNELD 00140000 /* use the kerneld message channel, new protocol */
#define KDHDR (sizeof(long) + sizeof(short) + sizeof(short))
#define NULL_KDHDR 0, 2, 0
#else
#define IPC_KERNELD 00040000 /* use the kerneld message channel */
#define KDHDR (sizeof(long))
#define NULL_KDHDR 0
#endif
#define KERNELD_MAXCMD 0x7ffeffff
#define KERNELD_MINSEQ 0x7fff0000 /* "commands" legal up to 0x7ffeffff */
#define KERNELD_WAIT 0x80000000
#define KERNELD_NOWAIT 0
struct kerneld_msg {
long mtype;
long id;
#ifdef NEW_KERNELD_PROTOCOL
short version;
short pid;
#endif
#ifdef __KERNEL__
char *text;
#else
char text[1];
#endif /* __KERNEL__ */
};
struct __persist {
int keylen;
int arglen;
char arr[0];
};
#ifdef __KERNEL__
#include <linux/malloc.h>
extern int kerneld_send(int msgtype, int ret_size, int msgsz,
const char *text, const char *ret_val);
/*
* Request that a module should be loaded.
* Wait for the exit status from insmod/modprobe.
* If it fails, it fails... at least we tried...
*/
static inline int request_module(const char *name)
{
return kerneld_send(KERNELD_REQUEST_MODULE,
0 | KERNELD_WAIT,
strlen(name), name, NULL);
}
/*
* Request the removal of a module, maybe don't wait for it.
* It doesn't matter if the removal fails, now does it?
*/
static inline int release_module(const char *name, int waitflag)
{
return kerneld_send(KERNELD_RELEASE_MODULE,
0 | (waitflag?KERNELD_WAIT:KERNELD_NOWAIT),
strlen(name), name, NULL);
}
/*
* Request a delayed removal of a module, but don't wait for it.
* The delay is done by kerneld (default: 60 seconds)
*/
static inline int delayed_release_module(const char *name)
{
return kerneld_send(KERNELD_DELAYED_RELEASE_MODULE,
0 | KERNELD_NOWAIT,
strlen(name), name, NULL);
}
/*
* Attempt to cancel a previous request for removal of a module,
* but don't wait for it.
* This call can be made if the kernel wants to prevent a delayed
* unloading of a module.
*/
static inline int cancel_release_module(const char *name)
{
return kerneld_send(KERNELD_CANCEL_RELEASE_MODULE,
0 | KERNELD_NOWAIT,
strlen(name), name, NULL);
}
/*
* Perform an "inverted" system call, maybe return the exit status
*/
static inline int ksystem(const char *cmd, int waitflag)
{
return kerneld_send(KERNELD_SYSTEM,
0 | (waitflag?KERNELD_WAIT:KERNELD_NOWAIT),
strlen(cmd), cmd, NULL);
}
/*
* Try to create a route, possibly by opening a ppp-connection
*/
static inline int kerneld_route(const char *ip_route)
{
return kerneld_send(KERNELD_REQUEST_ROUTE,
0 | KERNELD_WAIT,
strlen(ip_route), ip_route, NULL);
}
/*
* Handle an external screen blanker
*/
static inline int kerneld_blanker(int on_off) /* 0 => "off", else "on" */
{
return kerneld_send(KERNELD_BLANKER,
0 | (on_off?KERNELD_NOWAIT:KERNELD_WAIT),
strlen(on_off?"on":"off"), on_off?"on":"off", NULL);
}
/*
* Persistent storage for modules
*
* Usage:
* int get_persist("a key", &value, sizeof(value));
* Returns > 0 on success (return value == returned size)
*
* int set_persist("a key", &value, sizeof(value));
* Returns < 0 on failure
*
* To remove an entry, use: "set_persist("a key", NULL, 0);"
*/
static inline int set_persist(char *key, void *value, size_t length)
{
struct __persist *p;
int keylen = strlen(key) + 1;
int structsize = keylen + length + sizeof(struct __persist);
int status;
if ((p = (struct __persist *)kmalloc(structsize, GFP_ATOMIC)) == NULL)
return -ENOMEM;
strcpy(p->arr, key);
p->keylen = keylen;
p->arglen = length;
if (length)
memcpy(p->arr + keylen, value, length);
status = kerneld_send(KERNELD_SET_PERSIST,
0 | KERNELD_NOWAIT,
structsize, (char *)p, NULL);
kfree(p);
return status;
}
static inline int get_persist(char *key, void *value, size_t length)
{
return kerneld_send(KERNELD_GET_PERSIST,
length | KERNELD_WAIT,
strlen(key), key, value);
}
#endif /* __KERNEL__ */
#endif