52
51
strcat (pathname, name);
55
if (stat (pathname, &st))
57
return S_ISDIR (st.st_mode);
53
ret = grub_util_is_directory (pathname);
60
58
struct grub_hostfs_data
67
65
grub_hostfs_dir (grub_device_t device, const char *path,
68
int (*hook) (const char *filename,
69
const struct grub_dirhook_info *info))
66
grub_fs_dir_hook_t hook, void *hook_data)
68
grub_util_fd_dir_t dir;
73
70
/* Check if the disk is our dummy disk. */
74
71
if (grub_strcmp (device->disk->name, "host"))
75
72
return grub_error (GRUB_ERR_BAD_FS, "not a hostfs");
74
dir = grub_util_fd_opendir (path);
79
76
return grub_error (GRUB_ERR_BAD_FILENAME,
80
77
N_("can't open `%s': %s"), path,
78
grub_util_fd_strerror ());
82
grub_util_fd_dirent_t de;
86
83
struct grub_dirhook_info info;
87
84
grub_memset (&info, 0, sizeof (info));
86
de = grub_util_fd_readdir (dir);
93
90
info.dir = !! is_dir (path, de->d_name);
94
hook (de->d_name, &info);
91
hook (de->d_name, &info, hook_data);
95
grub_util_fd_closedir (dir);
100
97
return GRUB_ERR_NONE;
104
101
static grub_err_t
105
102
grub_hostfs_open (struct grub_file *file, const char *name)
108
105
struct grub_hostfs_data *data;
110
f = fopen (name, "rb");
107
f = grub_util_fd_open (name, GRUB_UTIL_FD_O_RDONLY);
108
if (! GRUB_UTIL_FD_IS_VALID (f))
112
109
return grub_error (GRUB_ERR_BAD_FILENAME,
113
110
N_("can't open `%s': %s"), name,
114
111
strerror (errno));
115
112
data = grub_malloc (sizeof (*data));
115
grub_util_fd_close (f);
119
116
return grub_errno;
121
118
data->filename = grub_strdup (name);
122
119
if (!data->filename)
124
121
grub_free (data);
122
grub_util_fd_close (f);
126
123
return grub_errno;
131
128
file->data = data;
134
file->size = grub_util_get_disk_size (name);
136
file->size = grub_util_get_fd_size (fileno (f), name, NULL);
130
file->size = grub_util_get_fd_size (f, name, NULL);
139
132
return GRUB_ERR_NONE;
145
138
struct grub_hostfs_data *data;
147
140
data = file->data;
148
if (fseeko (data->f, file->offset, SEEK_SET) != 0)
141
if (grub_util_fd_seek (data->f, file->offset) != 0)
150
143
grub_error (GRUB_ERR_OUT_OF_RANGE, N_("cannot seek `%s': %s"),
151
data->filename, strerror (errno));
144
data->filename, grub_util_fd_strerror ());
155
unsigned int s = fread (buf, 1, len, data->f);
148
unsigned int s = grub_util_fd_read (data->f, buf, len);
157
150
grub_error (GRUB_ERR_FILE_READ_ERROR, N_("cannot read `%s': %s"),
158
data->filename, strerror (errno));
151
data->filename, grub_util_fd_strerror ());
160
153
return (signed) s;