• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
may b a minor error
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

may b a minor error


  • Subject: may b a minor error
  • From: sugumaran narayanan <email@hidden>
  • Date: Thu, 15 Jun 2006 02:44:04 -0700 (PDT)

Hi
   I am quite new to the Mac world...I am trying to
write(using xcode on tiger) a simple character
driver(openbsd.org example) and am facing few
problems...

   During compile, struct uio is not recognized and I
get a dereferencing pointer to incomplete type
error...can somebody help...maybe I am not including
the correct libraries...
my code is as follows

#include <mach/mach_types.h>
#include <sys/types.h>
#include <sys/proc.h>
#include <sys/dkstat.h>
#include <sys/fcntl.h>
//#include <sys/module.h>
#include <sys/systm.h>  /* uprintf */
#include <sys/errno.h>
#include <sys/param.h>  /* defines used in kernel.h */
#include <sys/kernel.h> /* types used in module
initialization */
#include <sys/conf.h>   /* cdevsw struct */
#include <sys/uio.h>    /* uio struct */
#include <sys/malloc.h>
#include <sys/kernel_types.h>

#define MIN(a,b) (((a) < (b)) ? (a) : (b))


#define BUFFERSIZE 256

/* Function prototypes */
d_open_t    echo_open;
d_close_t   echo_close;
d_read_t    echo_read;
d_write_t   echo_write;

/* Character device entry points */
static struct cdevsw echo_cdevsw = {
    echo_open,
    echo_close,
    echo_read,
    echo_write,
    0,
    0,
    0,
    0,
    "echo",
    33,              /* reserved for lkms -
/usr/src/sys/conf/majors */
    0,
    0,
    2,
    -1
};

struct s_echo {
    char msg[BUFFERSIZE];
    int len;
} ;

/* vars */
static dev_t sdev;
static int count;
static struct s_echo *echomsg;

//MALLOC_DECLARE(M_ECHOBUF);
//MALLOC_DEFINE(M_ECHOBUF, "echobuffer", "buffer for
echo module");

kern_return_t chardriver_start (kmod_info_t * ki, void
* d) {
    return KERN_SUCCESS;
}


kern_return_t chardriver_stop (kmod_info_t * ki, void
* d) {
    return KERN_SUCCESS;
}

/*
 * This function is called by the kld[un]load(2)
system calls to
 * determine what actions to take when a module is
loaded or unloaded.


static int
echo_loader(struct module *m, int what, void *arg)
{
    int err = 0;

    switch (what) {
    case MOD_LOAD:                 kldload
        sdev = make_dev(&echo_cdevsw,
            0,
            UID_ROOT,
            GID_WHEEL,
            0600,
            "echo");
         kmalloc memory for use by this driver
        MALLOC(echomsg, struct s_echo *, sizeof(struct
s_echo), M_ECHOBUF, M_WAITOK);
        printf("Echo device loaded.\n");
        break;
    case MOD_UNLOAD:
        destroy_dev(sdev);
        FREE(echomsg,M_ECHOBUF);
        printf("Echo device unloaded.\n");
        break;
    default:
        err = EINVAL;
        break;
    }
    return(err);
}*/

int
echo_open(dev_t dev, int oflags, int devtype, struct
proc *p)
{
    int err = 0;

    uprintf("Opened device \"echo\" successfully.\n");
    return(err);
}

int
echo_close(dev_t dev, int fflag, int devtype, struct
proc *p)
{
    uprintf("Closing device \"echo.\"\n");
    return(0);
}

/*
 * The read function just takes the buf that was saved
via
 * echo_write() and returns it to userland for
accessing.
 * uio(9)
 */

int
echo_read(dev_t dev, struct uio *uio, int ioflag)
{
    int err = 0;
    int amt=echomsg->len;
//	struct uio trial;

    /*
     * How big is this read operation?  Either as big
as the user wants,
     * or as big as the remaining data
     */
    amt = MIN(uio->uio_resid, (echomsg->len -
uio->uio_offset > 0) ?
        echomsg->len - uio->uio_offset : 0);
    if ((err = uiomove(echomsg->msg +
uio->uio_offset,amt,uio)) != 0) {
        uprintf("uiomove failed!\n");
    }
    return(err);
}

/*
 * echo_write takes in a character string and saves it
 * to buf for later accessing.
 */

int
echo_write(dev_t dev, struct uio *uio, int ioflag)
{
    int err = 0;

    /* Copy the string in from user memory to kernel
memory */
    err = copyin(uio->uio_iov->iov_base,
echomsg->msg,MIN(uio->uio_iov->iov_len, BUFFERSIZE -
1));

    /* Now we need to null terminate, then record the
length */
    *(echomsg->msg + MIN(uio->uio_iov->iov_len,
BUFFERSIZE - 1)) = 0;
    echomsg->len = MIN(uio->uio_iov->iov_len,
BUFFERSIZE);

    if (err != 0) {
        uprintf("Write failed: bad address!\n");
    }
    count++;
    return(err);
}

regards
Sugumaran CL

__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Darwin-kernel mailing list      (email@hidden)
Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden

  • Follow-Ups:
    • Re: may b a minor error
      • From: Andrew Gallatin <email@hidden>
  • Prev by Date: Re: mbuf data access (repost)
  • Next by Date: Re: may b a minor error
  • Previous by thread: Boundary communication using IOMemory* and IOMemoryDescriptor*. Comments awaited.
  • Next by thread: Re: may b a minor error
  • Index(es):
    • Date
    • Thread