ib_alloc.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. #include <sys/types.h>
  24. #include <sys/stat.h>
  25. #include <fcntl.h>
  26. #include <unistd.h>
  27. #include <string.h>
  28. #include <errno.h>
  29. #include <stdlib.h>
  30. #include "memalign.h"
  31. #include "iblok.h"
  32. struct iblok *
  33. ib_alloc(int fd, unsigned blksize)
  34. {
  35. static long pagesize;
  36. struct iblok *ip;
  37. struct stat st;
  38. if (pagesize == 0)
  39. if ((pagesize = sysconf(_SC_PAGESIZE)) < 0)
  40. pagesize = 4096;
  41. if (blksize == 0) {
  42. if (fstat(fd, &st) < 0)
  43. return NULL;
  44. blksize = st.st_blksize > 0 ? st.st_blksize : 512;
  45. }
  46. if ((ip = calloc(1, sizeof *ip)) == NULL)
  47. return NULL;
  48. if ((ip->ib_blk = memalign(pagesize, blksize)) == NULL) {
  49. free(ip);
  50. return NULL;
  51. }
  52. ip->ib_blksize = blksize;
  53. ip->ib_fd = fd;
  54. ip->ib_mb_cur_max = MB_CUR_MAX;
  55. return ip;
  56. }