Hello guys,
Ok, now I need some advice here: I have this piece of code which
is not cooperating very much. You can help me to figure out what is
going wrong by taking a quick look at the Xsgi source code.
On the directory programs/Xserver/hw/sgi, you have to grep for
shmiqInit, once you find it, quickly figure what I am doing
wrong. And if you have a chance to tell me what the thing with XXX
is, I will be even more happy :-)
cheers,
Miguel.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/shmiq.h>
#include <sys/stropts.h>
#include <errno.h>
int
mopen (char *file, int flags, int x)
{
int fd;
fd = open (file, flags, x);
if (fd == -1){
fprintf (stderr, "can't open %s\n", file);
exit (1);
}
}
int
main ()
{
struct shmiqreq s;
int shmiq, kbd, zero, qcntl;
int v;
void *shaddr;
zero = mopen ("/dev/zero", O_RDWR,0);
shaddr = mmap(0, 16384, PROT_WRITE|PROT_READ, MAP_PRIVATE, zero, 0);
shmiq = mopen ("/dev/shmiq", O_RDWR|O_EXCL|O_NOCTTY, 3);
qcntl = mopen("/dev/qcntl0", O_RDWR|O_EXCL|O_NOCTTY, 0);
fcntl(qcntl, F_SETFD, 1);
s.user_vaddr = shaddr;
s.arg = 0x00000553; /* XXX, this ought to be
sizeof(shmiqSOMETHING) */
/* XXX, figure what this one is */
/* 0x80085101 is QIOCATTACH */
v = ioctl (qcntl, 0x80085101, (void *) &s);
if (v == -1)
v = errno;
printf ("map regs: %d/%d\n", v, errno);
kbd = mopen ("/dev/input/keyboard", O_RDWR|O_NDELAY|O_EXCL|O_NOCTTY,
0);
v = ioctl (kbd, I_PUSH, "keyboard");
printf ("I_PUSH: %d\n", v);
v = ioctl (shmiq, I_LINK, kbd);
printf ("I_LINK: %d\n", v);
printf ("shmqevent is: %d", sizeof (struct shmqevent));
while (0){
}
return 0;
}
|