/* * Copyright (C) 1993-2001 by Darren Reed. * * See the IPFILTER.LICENCE file for details on licencing. */ /* * kmemcpy() - copies n bytes from kernel memory into user buffer. * returns 0 on success, -1 on error. */ #include #include #include #include #include #include #include "kmem.h" #ifndef __STDC__ # define const #endif #if !defined(lint) static const char sccsid[] = "@(#)kmem.c 1.4 1/12/96 (C) 1992 Darren Reed"; static const char rcsid[] = "@(#)$Id: kmem.c,v 2.2.2.3 2001/07/15 22:06:16 darrenr Exp $"; #endif static int kmemfd = -1; int openkmem(core) char *core; { if (core == NULL) core = KMEM; if ((kmemfd = open(core, O_RDONLY)) == -1) { perror("kmeminit:open"); return -1; } return kmemfd; } int kmemcpy(buf, pos, n) register char *buf; long pos; register int n; { register int r; if (!n) return 0; if (kmemfd == -1) if (openkmem(NULL) == -1) return -1; if (lseek(kmemfd, pos, 0) == -1) { perror("kmemcpy:lseek"); return -1; } while ((r = read(kmemfd, buf, n)) < n) if (r <= 0) { perror("kmemcpy:read"); return -1; } else { buf += r; n -= r; } return 0; } int kstrncpy(buf, pos, n) register char *buf; long pos; register int n; { register int r; if (!n) return 0; if (kmemfd == -1) if (openkmem(NULL) == -1) return -1; if (lseek(kmemfd, pos, 0) == -1) { perror("kmemcpy:lseek"); return -1; } while (n > 0) { r = read(kmemfd, buf, 1); if (r <= 0) { perror("kmemcpy:read"); return -1; } else { if (*buf == '\0') break; buf++; n--; } } return 0; }