1 /*
2 * Copyright (c) 2003 Gunnar Ritter
3 *
4 * This software is provided 'as-is', without any express or implied
5 * warranty. In no event will the authors be held liable for any damages
6 * arising from the use of this software.
7 *
8 * Permission is granted to anyone to use this software for any purpose,
9 * including commercial applications, and to alter it and redistribute
10 * it freely, subject to the following restrictions:
11 *
12 * 1. The origin of this software must not be misrepresented; you must not
13 * claim that you wrote the original software. If you use this software
14 * in a product, an acknowledgment in the product documentation would be
15 * appreciated but is not required.
16 *
17 * 2. Altered source versions must be plainly marked as such, and must not be
18 * misrepresented as being the original software.
19 *
20 * 3. This notice may not be removed or altered from any source distribution.
21 */
22 /* Sccsid @(#)ib_alloc.c 1.5 (gritter) 3/12/05 */
23
24 #include <sys/types.h>
25 #include <sys/stat.h>
26 #include <fcntl.h>
27 #include <unistd.h>
28 #include <string.h>
29 #include <errno.h>
30 #include <stdlib.h>
31
32 #include "memalign.h"
33 #include "iblok.h"
34
35 struct iblok *
ib_alloc(int fd,unsigned blksize)36 ib_alloc(int fd, unsigned blksize)
37 {
38 static long pagesize;
39 struct iblok *ip;
40 struct stat st;
41
42 if (pagesize == 0)
43 if ((pagesize = sysconf(_SC_PAGESIZE)) < 0)
44 pagesize = 4096;
45 if (blksize == 0) {
46 if (fstat(fd, &st) < 0)
47 return NULL;
48 blksize = st.st_blksize > 0 ? st.st_blksize : 512;
49 }
50 if ((ip = calloc(1, sizeof *ip)) == NULL)
51 return NULL;
52 if ((ip->ib_blk = memalign(pagesize, blksize)) == NULL) {
53 free(ip);
54 return NULL;
55 }
56 ip->ib_blksize = blksize;
57 ip->ib_fd = fd;
58 ip->ib_mb_cur_max = MB_CUR_MAX;
59 return ip;
60 }
61