mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-10 11:26:16 +01:00
GMappedFile: return an error when trying to map a device
Previously, we were returning an empty buffer for all filenames where fstat() gives a size of 0. But this is only appropriate for regular files. Also improve the documentation around this issue. Based on a patch by Ryan Lortie. Conflicts: glib/tests/mappedfile.c https://bugzilla.gnome.org/show_bug.cgi?id=659212
This commit is contained in:
parent
b83e0a39fb
commit
f18eab2ac7
@ -80,8 +80,8 @@ differences in when a system will report a given error, etc.
|
||||
couldn't find the device. This can mean that the device file was
|
||||
installed incorrectly, or that the physical device is missing or
|
||||
not correctly attached to the computer.
|
||||
@G_FILE_ERROR_NODEV: This file is of a type that doesn't support
|
||||
mapping.
|
||||
@G_FILE_ERROR_NODEV: The underlying file system of the specified file
|
||||
does not support memory mapping.
|
||||
@G_FILE_ERROR_ROFS: The directory containing the new link can't be
|
||||
modified because it's on a read-only file system.
|
||||
@G_FILE_ERROR_TXTBSY: Text file busy.
|
||||
|
@ -112,14 +112,19 @@ g_mapped_file_destroy (GMappedFile *file)
|
||||
* Maps a file into memory. On UNIX, this is using the mmap() function.
|
||||
*
|
||||
* If @writable is %TRUE, the mapped buffer may be modified, otherwise
|
||||
* it is an error to modify the mapped buffer. Modifications to the buffer
|
||||
* are not visible to other processes mapping the same file, and are not
|
||||
* it is an error to modify the mapped buffer. Modifications to the buffer
|
||||
* are not visible to other processes mapping the same file, and are not
|
||||
* written back to the file.
|
||||
*
|
||||
* Note that modifications of the underlying file might affect the contents
|
||||
* of the #GMappedFile. Therefore, mapping should only be used if the file
|
||||
* of the #GMappedFile. Therefore, mapping should only be used if the file
|
||||
* will not be modified, or if all modifications of the file are done
|
||||
* atomically (e.g. using g_file_set_contents()).
|
||||
* atomically (e.g. using g_file_set_contents()).
|
||||
*
|
||||
* If @filename is the name of an empty, regular file, the function
|
||||
* will successfully return an empty #GMappedFile. In other cases of
|
||||
* size 0 (e.g. device files such as /dev/null), @error will be set
|
||||
* to the #GFileError value #G_FILE_ERROR_INVAL.
|
||||
*
|
||||
* Return value: a newly allocated #GMappedFile which must be unref'd
|
||||
* with g_mapped_file_unref(), or %NULL if the mapping failed.
|
||||
|
@ -36,6 +36,18 @@ test_empty (void)
|
||||
g_mapped_file_free (file);
|
||||
}
|
||||
|
||||
static void
|
||||
test_device (void)
|
||||
{
|
||||
GError *error = NULL;
|
||||
GMappedFile *file;
|
||||
|
||||
file = g_mapped_file_new ("/dev/null", FALSE, &error);
|
||||
g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_INVAL);
|
||||
g_assert (file == NULL);
|
||||
g_error_free (error);
|
||||
}
|
||||
|
||||
static void
|
||||
test_nonexisting (void)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user