From: <ky...@us...> - 2007-03-21 14:21:36
|
Revision: 420 http://svn.sourceforge.net/crackerjack/?rev=420&view=rev Author: kyagi Date: 2007-03-21 07:21:35 -0700 (Wed, 21 Mar 2007) Log Message: ----------- mv filename Added Paths: ----------- trunk/crackerjack/testcases/old_mmap/old_mmap_test.c Copied: trunk/crackerjack/testcases/old_mmap/old_mmap_test.c (from rev 417, trunk/crackerjack/testcases/old_mmap/mmap_test.c) =================================================================== --- trunk/crackerjack/testcases/old_mmap/old_mmap_test.c (rev 0) +++ trunk/crackerjack/testcases/old_mmap/old_mmap_test.c 2007-03-21 14:21:35 UTC (rev 420) @@ -0,0 +1,158 @@ +/* +* Crackerjack Project +* +* Copyright (C) 2007 Miracle Linux Corp, All Rights Reserved. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it would be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* +* Further, this software is distributed without any warranty that it is +* free of the rightful claim of any third person regarding infringement +* or the like. Any license provided herein, whether implied or +* otherwise, applies only to this software file. Patent licenses, if +* any, provided herein do not apply to combinations of this program with +* other software, or any other product whatsoever. +* +* You should have received a copy of the GNU General Public License along +* with this program; if not, write the Free Software Foundation, Inc., 59 +* Temple Place - Suite 330, Boston MA 02111-1307, USA. +* +* $Id$ +*/ + +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/mman.h> +#include <errno.h> + +#define PRINT(X) printf("%s\n", X) +#define OK PRINT("OK") +#define NG PRINT("NG") + +#define NUMBER_OF_MMAP_FILES 2 +static char *mmap_files[] = { "/etc/passwd", "/etc/inittab" }; + +struct retval { + void *p; + size_t size; + int fd; +}; + +void * +open_and_mmap(char *path, struct retval *retval) +{ + int fd; + void *p = NULL; + struct stat statbuf; + int ret; + + fd = open(path, O_RDONLY); + if (fd < 0) { + perror("open"); + puts (path); + NG; + return NULL; + } + + ret = fstat(fd, &statbuf); + if (ret == -1) { + perror("fstat"); + puts (path); + NG; + return NULL; + } + + ret = lseek(fd, statbuf.st_size - 1, SEEK_SET); + if (ret == -1) { + perror("lseek"); + puts (path); + NG; + return NULL; + } + + retval->p = mmap(0, statbuf.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (p == MAP_FAILED) { + switch(errno) { + case EACCES: + case EAGAIN: + case EBADF: + case EINVAL: + case ENFILE: + case ENODEV: + case ENOMEM: + case EPERM: + case ETXTBSY: + break; + default: + perror("mmap"); + NG; + return NULL; + } + } + + retval->size = statbuf.st_size; + retval->fd = fd; + + return retval; +} + +int +close_and_munmap(struct retval *retval) +{ + int ret; + + ret = munmap(retval->p, retval->size); + if (ret == -1) { + switch(errno) { + case EACCES: + case EAGAIN: + case EBADF: + case EINVAL: + case ENFILE: + case ENODEV: + case ENOMEM: + case EPERM: + case ETXTBSY: + break; + default: + perror("munmap"); + NG; + return ret; + } + } + + close(retval->fd); + + return ret; +} + +int +main(int argc, char **argv) +{ + int i; + struct retval retval; + retval.p = NULL; + retval.size = 0; + retval.fd = -1; + + for (i=0; i<NUMBER_OF_MMAP_FILES; i++) { + open_and_mmap(mmap_files[i], &retval); + if (retval.p == NULL || retval.p == MAP_FAILED) { + NG; + return 1; + } + close_and_munmap(&retval); + } + + OK; + return 0; +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |