fshelp.h 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /* fshelp.h -- Filesystem helper functions */
  2. /*
  3. * GRUB -- GRand Unified Bootloader
  4. * Copyright (C) 2004,2005,2006,2007,2008 Free Software Foundation, Inc.
  5. *
  6. * GRUB is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * GRUB is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #ifndef GRUB_FSHELP_HEADER
  20. #define GRUB_FSHELP_HEADER 1
  21. #include <grub/types.h>
  22. #include <grub/symbol.h>
  23. #include <grub/err.h>
  24. typedef struct grub_fshelp_node *grub_fshelp_node_t;
  25. #define GRUB_FSHELP_CASE_INSENSITIVE 0x100
  26. #define GRUB_FSHELP_TYPE_MASK 0xff
  27. #define GRUB_FSHELP_FLAGS_MASK 0x100
  28. enum grub_fshelp_filetype
  29. {
  30. GRUB_FSHELP_UNKNOWN,
  31. GRUB_FSHELP_REG,
  32. GRUB_FSHELP_DIR,
  33. GRUB_FSHELP_SYMLINK
  34. };
  35. /* Lookup the node PATH. The node ROOTNODE describes the root of the
  36. directory tree. The node found is returned in FOUNDNODE, which is
  37. either a ROOTNODE or a new malloc'ed node. ITERATE_DIR is used to
  38. iterate over all directory entries in the current node.
  39. READ_SYMLINK is used to read the symlink if a node is a symlink.
  40. EXPECTTYPE is the type node that is expected by the called, an
  41. error is generated if the node is not of the expected type. Make
  42. sure you use the NESTED_FUNC_ATTR macro for HOOK, this is required
  43. because GCC has a nasty bug when using regparm=3. */
  44. grub_err_t grub_fshelp_find_file (const char *path,
  45. grub_fshelp_node_t rootnode,
  46. grub_fshelp_node_t *foundnode,
  47. int (*iterate_dir)
  48. (grub_fshelp_node_t dir,
  49. int (*hook)
  50. (const char *filename,
  51. enum grub_fshelp_filetype filetype,
  52. grub_fshelp_node_t node,
  53. void *closure),
  54. void *closure),
  55. void *closure,
  56. char *(*read_symlink) (grub_fshelp_node_t node),
  57. enum grub_fshelp_filetype expect);
  58. /* Read LEN bytes from the file NODE on disk DISK into the buffer BUF,
  59. beginning with the block POS. READ_HOOK should be set before
  60. reading a block from the file. GET_BLOCK is used to translate file
  61. blocks to disk blocks. The file is FILESIZE bytes big and the
  62. blocks have a size of LOG2BLOCKSIZE (in log2). */
  63. grub_ssize_t grub_fshelp_read_file (grub_disk_t disk, grub_fshelp_node_t node,
  64. void (*read_hook)
  65. (grub_disk_addr_t sector,
  66. unsigned offset,
  67. unsigned length,
  68. void *closure),
  69. void *closure, int flags,
  70. grub_off_t pos, grub_size_t len, char *buf,
  71. grub_disk_addr_t (*get_block)
  72. (grub_fshelp_node_t node,
  73. grub_disk_addr_t block),
  74. grub_off_t filesize, int log2blocksize);
  75. unsigned int grub_fshelp_log2blksize (unsigned int blksize,
  76. unsigned int *pow);
  77. #endif /* ! GRUB_FSHELP_HEADER */