fgets: Don't swallow \n, treat EOF
feof: Crude implementation
signal: Return error

diff --git a/dlls/crtdll/crtdll_main.c b/dlls/crtdll/crtdll_main.c
index 9efb46c..517a2cd 100644
--- a/dlls/crtdll/crtdll_main.c
+++ b/dlls/crtdll/crtdll_main.c
@@ -5,7 +5,7 @@
  *
  * Copyright 1996,1998 Marcus Meissner
  * Copyright 1996 Jukka Iivonen
- * Copyright 1997 Uwe Bonnes
+ * Copyright 1997,2000 Uwe Bonnes
  */
 
 /*
@@ -19,6 +19,8 @@
 AJ 990101:
 - needs a proper stdio emulation based on Win32 file handles
 - should set CRTDLL errno from GetLastError() in every function
+UB 000416:
+- probably not thread safe
 */
 
 /* NOTE: This file also implements the wcs* functions. They _ARE_ in 
@@ -845,7 +847,11 @@
             if (--size <= 0) break;
             *s++ = (char)cc;
         }
-
+    if ((cc == EOF) &&(s == buf_start)) /* If nothing read, return 0*/
+      return 0;
+    if (cc == '\n')
+      if (--size > 0)
+	*s++ = '\n';
     *s = '\0';
 
     TRACE("got '%s'\n", buf_start);
@@ -1258,11 +1264,19 @@
 
 /*********************************************************************
  *                  feof           (CRTDLL.363)
+ * FIXME: Care for large files
+ * FIXME: Check errors
  */
 INT __cdecl CRTDLL_feof( CRTDLL_FILE *file )
 {
-    FIXME("stub\n" );
-    return 0;
+  DWORD curpos=SetFilePointer( file->handle, 0, NULL, SEEK_CUR );
+  DWORD endpos=SetFilePointer( file->handle, 0, NULL, FILE_END );
+  
+  if (curpos==endpos)
+    return TRUE;
+  else
+    SetFilePointer( file->handle, curpos,0,FILE_BEGIN);
+  return FALSE;
 }
 
 /*********************************************************************
@@ -1715,9 +1729,10 @@
 /*********************************************************************
  *                  signal           (CRTDLL.455)
  */
-VOID __cdecl CRTDLL_signal(int sig, sig_handler_type ptr)
+void * __cdecl CRTDLL_signal(int sig, sig_handler_type ptr)
 {
     FIXME("(%d %p):stub.\n", sig, ptr);
+    return (void*)-1;
 }
 
 /*********************************************************************