[ Next Article |
Previous Article |
Book Contents |
Library Home |
Legal |
Search ]
Kernel Extensions and Device Support Programming Concepts
demokext.c Example File
#include <sys/types.h>
#include <sys/malloc.h>
#include <sys/uio.h>
#include <sys/dump.h>
#include <sys/errno.h>
#include <sys/uprintf.h>
#include <fcntl.h>
#include "demo.h"
/* Log routine prototypes */
int open_log(char *path, struct file **fpp);
int write_log(struct file *fpp, char *buf, int *bytes_written);
int close_log(struct file *fpp);
/* Unexported symbol */
int demokext_i = 9;
/* Exported symbol */
int demokext_j = 99;
/*
* Kernel extension entry point, called at config. time.
*
* input:
* cmd - unused (typically 1=config, 2=unconfig)
* uiop - points to the uio structure.
*/
int
demokext(int cmd, struct uio *uiop)
{
int rc;
char *bufp;
struct file *fpp;
int fstat;
char buf[100];
int bytes_written;
static int j = 0;
/*
* Open the log file.
*/
strcpy(buf, "./demokext.log");
fstat = open_log(buf, &fpp);
if (fstat != 0) return(fstat);
/*
* Put a message out to the log file.
*/
strcpy(buf, "demokext was called for configuration\n");
fstat = write_log(fpp, buf, &bytes_written);
if (fstat != 0) return(fstat);
/*
* Increment or decrement j and demokext_j based on
* the input value for cmd.
*/
{
switch (cmd)
{
case 1: /* Increment */
sprintf(buf, "Before increment: j=%d demokext_j=%d\n",
j, demokext_j);
write_log(fpp, buf, &bytes_written);
demokext_j++;
j++;
sprintf(buf, "After increment: j=%d demokext_j=%d\n",
j, demokext_j);
write_log(fpp, buf, &bytes_written);
break;
case 2: /* Decrement */
sprintf(buf, "Before decrement: j=%d demokext_j=%d\n",
j, demokext_j);
write_log(fpp, buf, &bytes_written);
demokext_j--;
j--;
sprintf(buf, "After decrement: j=%d demokext_j=%d\n",
j, demokext_j);
write_log(fpp, buf, &bytes_written);
break;
default: /* Unknown command value */
sprintf(buf, "Received unknown command of %d\n", cmd);
write_log(fpp, buf, &bytes_written);
break;
}
}
/*
* Close the log file.
*/
fstat = close_log(fpp);
if (fstat !=0 ) return(fstat);
return(0);
}
/***************************************************
* Routines for logging debug information: *
* open_log - Opens a log file *
* write_log - Output a string to a log file *
* close_log - Close a log file *
***************************************************/
int open_log (char *path, struct file **fpp)
{
int rc;
rc = fp_open(path, O_CREAT | O_APPEND | O_WRONLY,
S_IRUSR | S_IWUSR, 0, SYS_ADSPACE, fpp);
return(rc);
}
int write_log(struct file *fpp, char *buf, int *bytes_written)
{
int rc;
rc = fp_write(fpp, buf, strlen(buf), 0, SYS_ADSPACE, bytes_written);
return(rc);
}
int close_log(struct file *fpp)
{
int rc;
rc = fp_close(fpp);
return(rc);
}
[ Next Article |
Previous Article |
Book Contents |
Library Home |
Legal |
Search ]