#include <config.h>
#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
#include <errno.h>
#include <glib.h>
#include <glib/gstdio.h>
GHashTable *options)
{
struct sr_input *in;
- struct sr_option *mod_opts;
+ const struct sr_option *mod_opts;
const GVariantType *gvt;
GHashTable *new_opts;
GHashTableIter iter;
*/
SR_API int sr_input_scan_file(const char *filename, const struct sr_input **in)
{
+ int64_t filesize;
FILE *stream;
const struct sr_input_module *imod;
GHashTable *meta;
GString *header;
- struct stat st;
size_t count;
unsigned int midx, i;
int ret;
sr_err("Invalid filename.");
return SR_ERR_ARG;
}
-
- if (!g_file_test(filename, G_FILE_TEST_EXISTS)) {
- sr_err("No such file.");
- return SR_ERR_ARG;
- }
-
- if (stat(filename, &st) < 0) {
- sr_err("%s", g_strerror(errno));
- return SR_ERR_ARG;
- }
-
stream = g_fopen(filename, "rb");
if (!stream) {
sr_err("Failed to open %s: %s", filename, g_strerror(errno));
return SR_ERR;
}
+ filesize = sr_file_get_size(stream);
+ if (filesize < 0) {
+ sr_err("Failed to get size of %s: %s",
+ filename, g_strerror(errno));
+ fclose(stream);
+ return SR_ERR;
+ }
/* This actually allocates 256 bytes to allow for NUL termination. */
header = g_string_sized_new(255);
count = fread(header->str, 1, header->allocated_len - 1, stream);
g_hash_table_insert(meta, GINT_TO_POINTER(SR_INPUT_META_FILENAME),
(char *)filename);
g_hash_table_insert(meta, GINT_TO_POINTER(SR_INPUT_META_FILESIZE),
- GSIZE_TO_POINTER(st.st_size));
+ GSIZE_TO_POINTER(MIN(filesize, G_MAXSSIZE)));
g_hash_table_insert(meta, GINT_TO_POINTER(SR_INPUT_META_HEADER),
header);
midx = 0;