~ari-tczew/ubuntu/lucid/skyeye/sru-lp-464175

« back to all changes in this revision

Viewing changes to utils/portable/beos/mman.c

  • Committer: Bazaar Package Importer
  • Author(s): Yu Guanghui
  • Date: 2007-08-07 13:25:49 UTC
  • mfrom: (1.1.2 upstream) (2.1.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20070807132549-96159k1obat1fxr0
Tags: 1.2.3-1
* New upstream release
* Added NO_BFD=1, don't require libbfd now. (Closes:Bug#423933) 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
        mman.c - portable mmap/munmap function for skyeye on BeOS
 
3
        Copyright (C) 2007 Anthony Lee <don.anthony.lee+program@gmail.com>
 
4
 
 
5
        This program is free software; you can redistribute it and/or modify
 
6
        it under the terms of the GNU General Public License as published by
 
7
        the Free Software Foundation; either version 2 of the License, or
 
8
        (at your option) any later version.
 
9
 
 
10
        This program is distributed in the hope that it will be useful,
 
11
        but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
        GNU General Public License for more details.
 
14
 
 
15
        You should have received a copy of the GNU General Public License
 
16
        along with this program; if not, write to the Free Software
 
17
        Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 
18
*/
 
19
 
 
20
/*
 
21
 * 04/12/2007   Written by Anthony Lee
 
22
 */
 
23
 
 
24
#include <sys/types.h>
 
25
#include <sys/stat.h>
 
26
#include <unistd.h>
 
27
#include <kernel/OS.h>
 
28
#include "portable/mman.h"
 
29
 
 
30
 
 
31
int getpagesize(void)
 
32
{
 
33
        return B_PAGE_SIZE;
 
34
}
 
35
 
 
36
 
 
37
void* mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
 
38
{
 
39
        area_id area;
 
40
        struct stat stat;
 
41
        ssize_t nBytes = 0, nRead;
 
42
        void *retVal = NULL;
 
43
 
 
44
        if ((flags & (MAP_FIXED | MAP_SHARED)) ||
 
45
            ((prot & PROT_WRITE) && fd != -1) ||
 
46
            length == 0) return MAP_FAILED;
 
47
 
 
48
        length = (length + (B_PAGE_SIZE - 1)) & ~(B_PAGE_SIZE - 1);
 
49
 
 
50
        if ((area = create_area("none", &retVal, B_ANY_ADDRESS,
 
51
                                length, B_NO_LOCK,
 
52
                                B_READ_AREA | B_WRITE_AREA)) < 0) return MAP_FAILED;
 
53
 
 
54
        if (fd != -1) {
 
55
                if (fstat(fd, &stat) != 0 ||
 
56
                    offset >= stat.st_size ||
 
57
                    lseek(fd, offset, SEEK_SET) == (off_t)-1) goto err;
 
58
 
 
59
                while (nBytes < (ssize_t)length) {
 
60
                        offset = lseek(fd, 0, SEEK_CUR);
 
61
                        if (offset == (off_t)-1 || offset >= stat.st_size) break;
 
62
 
 
63
                        nRead = read(fd, (void*)((char*)retVal + nBytes), length);
 
64
                        if (nRead == -1) {
 
65
                                nBytes = -1;
 
66
                                break;
 
67
                        } else {
 
68
                                nBytes += nRead;
 
69
                        }
 
70
                }
 
71
 
 
72
                if (nBytes == -1) goto err;
 
73
        }
 
74
 
 
75
        goto exit;
 
76
 
 
77
err:
 
78
        delete_area(area);
 
79
        retVal = NULL;
 
80
 
 
81
exit:
 
82
        return (retVal == NULL ? MAP_FAILED : retVal);
 
83
}
 
84
 
 
85
 
 
86
int munmap(void *addr, size_t length)
 
87
{
 
88
        area_id area;
 
89
 
 
90
        if (addr == NULL || addr == MAP_FAILED) return -1;
 
91
        if ((area = area_for(addr)) < 0) return -1;
 
92
 
 
93
        return (delete_area(area) != B_OK ? -1 : 0);
 
94
}
 
95