applied patch from Andreas Persenius <ndap@swipnet.se> that updates the
[platform/upstream/glib.git] / glib / giounix.c
index 82944be..2a06dac 100644 (file)
@@ -5,21 +5,28 @@
  * Copyright 1998 Owen Taylor
  *
  * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the GNU
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU Library General Public
+ * 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.
  */
 
+/*
+ * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
+ * file for a list of people on the GLib Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
 /* 
  * MT safe
  */
@@ -37,6 +44,7 @@ typedef struct _GIOUnixChannel GIOUnixChannel;
 typedef struct _GIOUnixWatch GIOUnixWatch;
 
 struct _GIOUnixChannel {
+  GIOChannel channel;
   gint fd;
 };
 
@@ -70,9 +78,11 @@ static guint  g_io_unix_add_watch (GIOChannel      *channel,
                                   GDestroyNotify notify);
 static gboolean g_io_unix_prepare  (gpointer source_data, 
                                    GTimeVal *current_time,
-                                   gint *timeout);
+                                   gint *timeout,
+                                   gpointer user_data);
 static gboolean g_io_unix_check    (gpointer source_data,
-                                   GTimeVal *current_time);
+                                   GTimeVal *current_time,
+                                   gpointer user_data);
 static gboolean g_io_unix_dispatch (gpointer source_data,
                                    GTimeVal *current_time,
                                    gpointer user_data);
@@ -97,7 +107,8 @@ GIOFuncs unix_channel_funcs = {
 static gboolean 
 g_io_unix_prepare  (gpointer source_data, 
                    GTimeVal *current_time,
-                   gint    *timeout)
+                   gint     *timeout,
+                   gpointer user_data)
 {
   *timeout = -1;
   return FALSE;
@@ -105,7 +116,8 @@ g_io_unix_prepare  (gpointer source_data,
 
 static gboolean 
 g_io_unix_check    (gpointer source_data,
-                   GTimeVal *current_time)
+                   GTimeVal *current_time,
+                   gpointer user_data)
 {
   GIOUnixWatch *data = source_data;
 
@@ -130,7 +142,7 @@ g_io_unix_destroy (gpointer source_data)
 {
   GIOUnixWatch *data = source_data;
 
-  g_main_poll_remove (&data->pollfd);
+  g_main_remove_poll (&data->pollfd);
   g_io_channel_unref (data->channel);
   g_free (data);
 }
@@ -141,7 +153,7 @@ g_io_unix_read (GIOChannel *channel,
                guint      count,
                guint     *bytes_read)
 {
-  GIOUnixChannel *unix_channel = channel->channel_data;
+  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
   gint result;
 
   result = read (unix_channel->fd, buf, count);
@@ -154,6 +166,7 @@ g_io_unix_read (GIOChannel *channel,
        case EINVAL:
          return G_IO_ERROR_INVAL;
        case EAGAIN:
+       case EINTR:
          return G_IO_ERROR_AGAIN;
        default:
          return G_IO_ERROR_UNKNOWN;
@@ -172,7 +185,7 @@ g_io_unix_write(GIOChannel *channel,
                guint      count,
                guint     *bytes_written)
 {
-  GIOUnixChannel *unix_channel = channel->channel_data;
+  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
   gint result;
 
   result = write (unix_channel->fd, buf, count);
@@ -185,6 +198,7 @@ g_io_unix_write(GIOChannel *channel,
        case EINVAL:
          return G_IO_ERROR_INVAL;
        case EAGAIN:
+       case EINTR:
          return G_IO_ERROR_AGAIN;
        default:
          return G_IO_ERROR_UNKNOWN;
@@ -202,7 +216,7 @@ g_io_unix_seek (GIOChannel *channel,
                gint      offset, 
                GSeekType type)
 {
-  GIOUnixChannel *unix_channel = channel->channel_data;
+  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
   int whence;
   off_t result;
 
@@ -242,7 +256,7 @@ g_io_unix_seek (GIOChannel *channel,
 static void 
 g_io_unix_close (GIOChannel *channel)
 {
-  GIOUnixChannel *unix_channel = channel->channel_data;
+  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
 
   close (unix_channel->fd);
 }
@@ -250,7 +264,7 @@ g_io_unix_close (GIOChannel *channel)
 static void 
 g_io_unix_free (GIOChannel *channel)
 {
-  GIOUnixChannel *unix_channel = channel->channel_data;
+  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
 
   g_free (unix_channel);
 }
@@ -264,7 +278,7 @@ g_io_unix_add_watch (GIOChannel    *channel,
                     GDestroyNotify notify)
 {
   GIOUnixWatch *watch = g_new (GIOUnixWatch, 1);
-  GIOUnixChannel *unix_channel = channel->channel_data;
+  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
   
   watch->channel = channel;
   g_io_channel_ref (channel);
@@ -275,7 +289,7 @@ g_io_unix_add_watch (GIOChannel    *channel,
   watch->pollfd.fd = unix_channel->fd;
   watch->pollfd.events = condition;
 
-  g_main_poll_add (priority, &watch->pollfd);
+  g_main_add_poll (&watch->pollfd, priority);
 
   return g_source_add (priority, TRUE, &unix_watch_funcs, watch, user_data, notify);
 }
@@ -284,14 +298,18 @@ GIOChannel *
 g_io_channel_unix_new (gint fd)
 {
   GIOUnixChannel *unix_channel = g_new (GIOUnixChannel, 1);
+  GIOChannel *channel = (GIOChannel *)unix_channel;
+
+  g_io_channel_init (channel);
+  channel->funcs = &unix_channel_funcs;
 
   unix_channel->fd = fd;
-  return g_io_channel_new (&unix_channel_funcs, unix_channel);
+  return channel;
 }
 
 gint
 g_io_channel_unix_get_fd (GIOChannel *channel)
 {
-  GIOUnixChannel *unix_channel = channel->channel_data;
+  GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
   return unix_channel->fd;
 }