diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 15f828df60a3472290bf56b48efc270a108483a3..7ab798d21e6735b29024ee7beb6d5e5105f0c650 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -4,6 +4,12 @@
 	* trans-const.c (gfc_conv_constant_to_tree): Give logical
 	constants the correct type.
 
+	PR fortran/19194
+	* trans-io.c (ADD_STRING): Use gfc_charlen_type_node for string
+	length parameters.
+	(gfc_build_io_library_fndecls): 'rec' and 'recl_in' are not
+	pointer fields.
+
 2005-01-18  Kazu Hirata  <kazu@cs.umass.edu>
 
 	* arith.c, array.c, check.c, decl.c, expr.c, f95-lang.c,
diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c
index 1ac48d4b2fdb7da93865060a84c9360365e17fa3..756ae064e3b3d64a1448b643799c68b26f73a769 100644
--- a/gcc/fortran/trans-io.c
+++ b/gcc/fortran/trans-io.c
@@ -147,7 +147,7 @@ static enum { READ, WRITE, IOLENGTH } last_dt;
 	 get_identifier (stringize(name)), pchar_type_node);		\
   ioparm_ ## name ## _len = gfc_add_field_to_struct			\
         (&(TYPE_FIELDS (ioparm_type)), ioparm_type,			\
-	 get_identifier (stringize(name) "_len"), gfc_int4_type_node)
+	 get_identifier (stringize(name) "_len"), gfc_charlen_type_node)
 
 
 /* Create function decls for IO library functions.  */
@@ -181,11 +181,11 @@ gfc_build_io_library_fndecls (void)
   ADD_FIELD (opened, gfc_pint4_type_node);
   ADD_FIELD (number, gfc_pint4_type_node);
   ADD_FIELD (named, gfc_pint4_type_node);
-  ADD_FIELD (rec, gfc_pint4_type_node);
+  ADD_FIELD (rec, gfc_int4_type_node);
   ADD_FIELD (nextrec, gfc_pint4_type_node);
   ADD_FIELD (size, gfc_pint4_type_node);
 
-  ADD_FIELD (recl_in, gfc_pint4_type_node);
+  ADD_FIELD (recl_in, gfc_int4_type_node);
   ADD_FIELD (recl_out, gfc_pint4_type_node);
 
   ADD_FIELD (iolength, gfc_pint4_type_node);
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 9f7e3789cd659faa3b6569850fd64aba001cb49f..95242b6396bd14f4192a939ab4bd628de627e17b 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,4 +1,10 @@
-2004-01-22  Bud Davis  <bdavis9659@comcast.net>
+2005-01-22  Tobias Schl"uter  <tobias.schlueter@physik.uni-muenchen.de>
+	
+	PR fortran/19194
+	* io/io.h (st_parameter): Use 'GFC_INTEGER_4' instead of 'int',
+	use CHARACTER macro for definition of string valued paramters.
+	
+2005-01-22  Bud Davis  <bdavis9659@comcast.net>
 
 	PR fortran/19314
 	* io/inquire.c(inquire_via_unit): implement POSITION=.
@@ -7,7 +13,7 @@
 	* io/rewind.c(st_rewind): update position for
 	INQUIRE.
 
-2004-01-16  Bud Davis  <bdavis9659@comcast.net>
+2005-01-16  Bud Davis  <bdavis9659@comcast.net>
 
 	PR fortran/18778
 	* io/transfer.c (us_read): no bytes available is not a
diff --git a/libgfortran/io/io.h b/libgfortran/io/io.h
index 862a0b3ca890e759252010a68c3bcee49f07b116..2975f9e73adb126649401826736e4e53fd74ccce 100644
--- a/libgfortran/io/io.h
+++ b/libgfortran/io/io.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+/* Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
    Contributed by Andy Vaught
 
 This file is part of the GNU Fortran 95 runtime library (libgfortran).
@@ -165,8 +165,8 @@ unit_mode;
 
 typedef struct
 {
-  int unit;
-  int err, end, eor, list_format;	/* These are flags, not values.  */
+  GFC_INTEGER_4 unit;
+  GFC_INTEGER_4 err, end, eor, list_format; /* These are flags, not values.  */
 
 /* Return values from library statements.  These are returned only if
    the labels are specified in the statement itself and the condition
@@ -183,58 +183,44 @@ typedef struct
   }
   library_return;
 
-  int *iostat, *exist, *opened, *number, *named, rec, *nextrec, *size;
-
-  int recl_in; 
-  int *recl_out;
-
-  int *iolength;
-
-  char *file;
-  int file_len;
-  char *status;
-  int status_len;
-  char *access;
-  int access_len;
-  char *form;
-  int form_len;
-  char *blank;
-  int blank_len;
-  char *position;
-  int position_len;
-  char *action;
-  int action_len;
-  char *delim;
-  int delim_len;
-  char *pad;
-  int pad_len;
-  char *format;
-  int format_len;
-  char *advance;
-  int advance_len;
-  char *name;
-  int name_len;
-  char *internal_unit;
-  int internal_unit_len;
-  char *sequential;
-  int sequential_len;
-  char *direct;
-  int direct_len;
-  char *formatted;
-  int formatted_len;
-  char *unformatted;
-  int unformatted_len;
-  char *read;
-  int read_len;
-  char *write;
-  int write_len;
-  char *readwrite;
-  int readwrite_len;
+  GFC_INTEGER_4 *iostat, *exist, *opened, *number, *named;
+  GFC_INTEGER_4 rec;
+  GFC_INTEGER_4 *nextrec, *size;
+
+  GFC_INTEGER_4 recl_in; 
+  GFC_INTEGER_4 *recl_out;
+
+  GFC_INTEGER_4 *iolength;
+
+#define CHARACTER(name) \
+              char * name; \
+              gfc_charlen_type name ## _len
+  CHARACTER (file);
+  CHARACTER (status);
+  CHARACTER (access);
+  CHARACTER (form);
+  CHARACTER (blank);
+  CHARACTER (position);
+  CHARACTER (action);
+  CHARACTER (delim);
+  CHARACTER (pad);
+  CHARACTER (format);
+  CHARACTER (advance);
+  CHARACTER (name);
+  CHARACTER (internal_unit);
+  CHARACTER (sequential);
+  CHARACTER (direct);
+  CHARACTER (formatted);
+  CHARACTER (unformatted);
+  CHARACTER (read);
+  CHARACTER (write);
+  CHARACTER (readwrite);
 
 /* namelist related data */
-  char * namelist_name;
-  int namelist_name_len;
-  int namelist_read_mode;
+  CHARACTER (namelist_name);
+  GFC_INTEGER_4 namelist_read_mode;
+
+#undef CHARACTER
 }
 st_parameter;