X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gio%2Fglocalfileinputstream.c;h=2b7944462869ca077f5e83149ad2a1f27f1d8999;hb=356a3987cee7ceddcb3fe623edf0bd2881895add;hp=5988a4faa1fc1c9ae9e79ae87c383606b31f1e48;hpb=efb1a054b0858b4475941892f53bbc5186065df9;p=platform%2Fupstream%2Fglib.git
diff --git a/gio/glocalfileinputstream.c b/gio/glocalfileinputstream.c
index 5988a4f..2b79444 100644
--- a/gio/glocalfileinputstream.c
+++ b/gio/glocalfileinputstream.c
@@ -13,9 +13,7 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- * Boston, MA 02111-1307, USA.
+ * Public License along with this library; if not, see .
*
* Author: Alexander Larsson
*/
@@ -25,9 +23,6 @@
#include
#include
#include
-#ifdef HAVE_UNISTD_H
-#include
-#endif
#include
#include
@@ -39,6 +34,8 @@
#include "glibintl.h"
#ifdef G_OS_UNIX
+#include
+#include "glib-unix.h"
#include "gfiledescriptorbased.h"
#endif
@@ -46,8 +43,10 @@
#include
#endif
-#include "gioalias.h"
-
+struct _GLocalFileInputStreamPrivate {
+ int fd;
+ guint do_close : 1;
+};
#ifdef G_OS_UNIX
static void g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface);
@@ -56,18 +55,14 @@ static void g_file_descriptor_based_iface_init (GFileDescriptorBasedIfac
#define g_local_file_input_stream_get_type _g_local_file_input_stream_get_type
#ifdef G_OS_UNIX
G_DEFINE_TYPE_WITH_CODE (GLocalFileInputStream, g_local_file_input_stream, G_TYPE_FILE_INPUT_STREAM,
+ G_ADD_PRIVATE (GLocalFileInputStream)
G_IMPLEMENT_INTERFACE (G_TYPE_FILE_DESCRIPTOR_BASED,
- g_file_descriptor_based_iface_init)
-);
+ g_file_descriptor_based_iface_init))
#else
-G_DEFINE_TYPE_WITH_CODE (GLocalFileInputStream, g_local_file_input_stream, G_TYPE_FILE_INPUT_STREAM,);
+G_DEFINE_TYPE_WITH_CODE (GLocalFileInputStream, g_local_file_input_stream, G_TYPE_FILE_INPUT_STREAM,
+ G_ADD_PRIVATE (GLocalFileInputStream))
#endif
-struct _GLocalFileInputStreamPrivate {
- int fd;
- guint do_close : 1;
-};
-
static gssize g_local_file_input_stream_read (GInputStream *stream,
void *buffer,
gsize count,
@@ -95,12 +90,6 @@ static GFileInfo *g_local_file_input_stream_query_info (GFileInputStream *strea
static int g_local_file_input_stream_get_fd (GFileDescriptorBased *stream);
#endif
-static void
-g_local_file_input_stream_finalize (GObject *object)
-{
- G_OBJECT_CLASS (g_local_file_input_stream_parent_class)->finalize (object);
-}
-
void
_g_local_file_input_stream_set_do_close (GLocalFileInputStream *in,
gboolean do_close)
@@ -111,13 +100,8 @@ _g_local_file_input_stream_set_do_close (GLocalFileInputStream *in,
static void
g_local_file_input_stream_class_init (GLocalFileInputStreamClass *klass)
{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GInputStreamClass *stream_class = G_INPUT_STREAM_CLASS (klass);
GFileInputStreamClass *file_stream_class = G_FILE_INPUT_STREAM_CLASS (klass);
-
- g_type_class_add_private (klass, sizeof (GLocalFileInputStreamPrivate));
-
- gobject_class->finalize = g_local_file_input_stream_finalize;
stream_class->read_fn = g_local_file_input_stream_read;
stream_class->skip = g_local_file_input_stream_skip;
@@ -139,9 +123,7 @@ g_file_descriptor_based_iface_init (GFileDescriptorBasedIface *iface)
static void
g_local_file_input_stream_init (GLocalFileInputStream *info)
{
- info->priv = G_TYPE_INSTANCE_GET_PRIVATE (info,
- G_TYPE_LOCAL_FILE_INPUT_STREAM,
- GLocalFileInputStreamPrivate);
+ info->priv = g_local_file_input_stream_get_instance_private (info);
info->priv->do_close = TRUE;
}
@@ -199,7 +181,7 @@ g_local_file_input_stream_skip (GInputStream *stream,
GCancellable *cancellable,
GError **error)
{
- off_t res, start;
+ off_t start, end;
GLocalFileInputStream *file;
file = G_LOCAL_FILE_INPUT_STREAM (stream);
@@ -219,8 +201,8 @@ g_local_file_input_stream_skip (GInputStream *stream,
return -1;
}
- res = lseek (file->priv->fd, count, SEEK_CUR);
- if (res == -1)
+ end = lseek (file->priv->fd, 0, SEEK_END);
+ if (end == -1)
{
int errsv = errno;
@@ -231,7 +213,22 @@ g_local_file_input_stream_skip (GInputStream *stream,
return -1;
}
- return res - start;
+ if (end - start > count)
+ {
+ end = lseek (file->priv->fd, count - (end - start), SEEK_CUR);
+ if (end == -1)
+ {
+ int errsv = errno;
+
+ g_set_error (error, G_IO_ERROR,
+ g_io_error_from_errno (errsv),
+ _("Error seeking in file: %s"),
+ g_strerror (errsv));
+ return -1;
+ }
+ }
+
+ return end - start;
}
static gboolean
@@ -240,7 +237,6 @@ g_local_file_input_stream_close (GInputStream *stream,
GError **error)
{
GLocalFileInputStream *file;
- int res;
file = G_LOCAL_FILE_INPUT_STREAM (stream);
@@ -250,22 +246,18 @@ g_local_file_input_stream_close (GInputStream *stream,
if (file->priv->fd == -1)
return TRUE;
- while (1)
+ if (!g_close (file->priv->fd, NULL))
{
- res = close (file->priv->fd);
- if (res == -1)
- {
- int errsv = errno;
-
- g_set_error (error, G_IO_ERROR,
- g_io_error_from_errno (errsv),
- _("Error closing file: %s"),
- g_strerror (errsv));
- }
- break;
+ int errsv = errno;
+
+ g_set_error (error, G_IO_ERROR,
+ g_io_error_from_errno (errsv),
+ _("Error closing file: %s"),
+ g_strerror (errsv));
+ return FALSE;
}
- return res != -1;
+ return TRUE;
}