MSVCRT: Add _sys_errlist and a per thread _strerror buffer

Uwe Bonnes bon at elektron.ikp.physik.tu-darmstadt.de
Sat Jan 21 15:40:11 CST 2006


Changelog:
      wine/dlls/msvcrt/errno.c,  wine/dlls/msvcrt/msvcrt.h, 
      wine/dlls/msvcrt/main.c
      Add a _sys_errlist and a per-thread _strerrbuff
-- 
Uwe Bonnes                bon at elektron.ikp.physik.tu-darmstadt.de

Institut fuer Kernphysik  Schlossgartenstrasse 9  64289 Darmstadt
--------- Tel. 06151 162516 -------- Fax. 06151 164321 ----------
Index: wine/dlls/msvcrt/data.c
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/data.c,v
retrieving revision 1.28
diff -u -r1.28 data.c
--- wine/dlls/msvcrt/data.c	2 Sep 2005 12:26:21 -0000	1.28
+++ wine/dlls/msvcrt/data.c	21 Jan 2006 20:29:56 -0000
@@ -43,8 +43,6 @@
 unsigned int MSVCRT__winmajor;
 unsigned int MSVCRT__winminor;
 unsigned int MSVCRT__winver;
-unsigned int MSVCRT__sys_nerr; /* FIXME: not accessible from Winelib apps */
-char**       MSVCRT__sys_errlist; /* FIXME: not accessible from Winelib apps */
 unsigned int MSVCRT___setlc_active;
 unsigned int MSVCRT___unguarded_readlc_active;
 double MSVCRT__HUGE;
@@ -270,7 +268,6 @@
   MSVCRT_osversion   = version & 0xFFFF;
   MSVCRT_osminor     = version & 0xFF;
   MSVCRT_osmajor     = (version>>8) & 0xFF;
-  MSVCRT__sys_nerr   = 43;
   MSVCRT__HUGE = HUGE_VAL;
   MSVCRT___setlc_active = 0;
   MSVCRT___unguarded_readlc_active = 0;
Index: wine/dlls/msvcrt/errno.c
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/errno.c,v
retrieving revision 1.13
diff -u -r1.13 errno.c
--- wine/dlls/msvcrt/errno.c	25 Jun 2004 01:19:15 -0000	1.13
+++ wine/dlls/msvcrt/errno.c	21 Jan 2006 20:29:56 -0000
@@ -2,6 +2,7 @@
  * msvcrt.dll errno functions
  *
  * Copyright 2000 Jon Griffiths
+ * Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details 
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -26,6 +27,65 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
 
+char __syserr00[] = "No Error";
+char __syserr01[] = "Operation not permitted (EPERM)";
+char __syserr02[] = "No such file or directory (ENOENT)";
+char __syserr03[] = "No such process (ESRCH)";
+char __syserr04[] = "Interrupted system call (EINTR)";
+char __syserr05[] = "Input or output error (EIO)";
+char __syserr06[] = "No such device or address (ENXIO)";
+char __syserr07[] = "Argument list too long (E2BIG)";
+char __syserr08[] = "Unable to execute file (ENOEXEC)";
+char __syserr09[] = "Bad file descriptor (EBADF)";
+char __syserr10[] = "No child processes (ECHILD)";
+char __syserr11[] = "Resource temporarily unavailable (EAGAIN)";
+char __syserr12[] = "Not enough memory (ENOMEM)";
+char __syserr13[] = "Permission denied (EACCES)";
+char __syserr14[] = "Bad address (EFAULT)";
+char __syserr15[] = "Unknown Error: 15";
+char __syserr16[] = "Resource busy (EBUSY)";
+char __syserr17[] = "File exists (EEXIST)";
+char __syserr18[] = "Improper link (EXDEV)";
+char __syserr19[] = "No such device (ENODEV)";
+char __syserr20[] = "Not a directory (ENOTDIR)";
+char __syserr21[] = "Is a directory (EISDIR)";
+char __syserr22[] = "Invalid argument (EINVAL)";
+char __syserr23[] = "Too many open files in system (ENFILE)";
+char __syserr24[] = "Too many open files (EMFILE)";
+char __syserr25[] = "Inappropriate I/O control operation (ENOTTY)";
+char __syserr26[] = "Unknown error: 26";
+char __syserr27[] = "File too large (EFBIG)";
+char __syserr28[] = "No space left on drive (ENOSPC)";
+char __syserr29[] = "Invalid seek (ESPIPE)";
+char __syserr30[] = "Read-only file system (EROFS)";
+char __syserr31[] = "Too many links (EMLINK)";
+char __syserr32[] = "Broken pipe (EPIPE)";
+char __syserr33[] = "Input to function out of range (EDOM)";
+char __syserr34[] = "Output of function out of range (ERANGE)";
+char __syserr35[] = "Unknown error: 35";
+char __syserr36[] = "Resource deadlock avoided (EDEADLK)";
+char __syserr37[] = "Unknown error: 37";
+char __syserr38[] = "File name too long (ENAMETOOLONG)";
+char __syserr39[] = "No locks available (ENOLCK)";
+char __syserr40[] = "Function not implemented (ENOSYS)";
+char __syserr41[] = "Directory not empty (ENOTEMPTY)";
+char __syserr42[] = "Illegal byte sequence (EILSEQ)";
+
+char *MSVCRT__sys_errlist[] = {/* FIXME: not accessible from Winelib apps */
+__syserr00, __syserr01, __syserr02, __syserr03, __syserr04,
+__syserr05, __syserr06, __syserr07, __syserr08, __syserr09,
+__syserr10, __syserr11, __syserr12, __syserr13, __syserr14,
+__syserr15, __syserr16, __syserr17, __syserr18, __syserr19,
+__syserr20, __syserr21, __syserr22, __syserr23, __syserr24,
+__syserr25, __syserr26, __syserr27, __syserr28, __syserr29,
+__syserr30, __syserr31, __syserr32, __syserr33, __syserr34,
+__syserr35, __syserr36, __syserr37, __syserr38, __syserr39,
+__syserr40, __syserr41, __syserr42
+};
+
+unsigned int MSVCRT__sys_nerr= sizeof(MSVCRT__sys_errlist) / sizeof(MSVCRT__sys_errlist[0]); 
+/* FIXME: not accessible from Winelib apps */
+
 
 /* INTERNAL: Set the crt and dos errno's from the OS error given. */
 void msvcrt_set_errno(int err)
@@ -108,7 +168,7 @@
  */
 char* MSVCRT_strerror(int err)
 {
-  return strerror(err); /* FIXME */
+  return MSVCRT__sys_errlist[err]; /* FIXME */
 }
 
 /**********************************************************************
@@ -116,9 +176,13 @@
  */
 char* _strerror(const char* err)
 {
-  static char strerrbuff[256]; /* FIXME: Per thread, nprintf */
-  sprintf(strerrbuff,"%s: %s\n",err,MSVCRT_strerror(msvcrt_get_thread_data()->thread_errno));
-  return strerrbuff;
+  if(msvcrt_get_thread_data()->thread_strerrbuff == NULL)
+    msvcrt_get_thread_data()->thread_strerrbuff = MSVCRT_malloc(256);
+  if(msvcrt_get_thread_data()->thread_strerrbuff == NULL)
+    return NULL;
+  sprintf(msvcrt_get_thread_data()->thread_strerrbuff,"%s%s%s\n",(err)?err:"",(err)?": ":"",
+	  MSVCRT_strerror(msvcrt_get_thread_data()->thread_errno));
+  return msvcrt_get_thread_data()->thread_strerrbuff;
 }
 
 /*********************************************************************
Index: wine/dlls/msvcrt/msvcrt.h
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/msvcrt.h,v
retrieving revision 1.46
diff -u -r1.46 msvcrt.h
--- wine/dlls/msvcrt/msvcrt.h	14 Jan 2006 17:00:46 -0000	1.46
+++ wine/dlls/msvcrt/msvcrt.h	21 Jan 2006 20:29:58 -0000
@@ -93,6 +93,7 @@
 struct __thread_data {
     int                             thread_errno;
     unsigned long                   thread_doserrno;
+    char                           *thread_strerrbuff;
     unsigned int                    random_seed;        /* seed for rand() */
     char                           *strtok_next;        /* next ptr for strtok() */
     unsigned char                  *mbstok_next;        /* next ptr for mbstok() */
Index: wine/dlls/msvcrt/main.c
===================================================================
RCS file: /home/wine/wine/dlls/msvcrt/main.c,v
retrieving revision 1.26
diff -u -r1.26 main.c
--- wine/dlls/msvcrt/main.c	14 Jan 2006 17:00:26 -0000	1.26
+++ wine/dlls/msvcrt/main.c	21 Jan 2006 20:29:58 -0000
@@ -75,6 +75,7 @@
 	HeapFree(GetProcessHeap(),0,tls->efcvt_buffer);
 	HeapFree(GetProcessHeap(),0,tls->asctime_buffer);
 	HeapFree(GetProcessHeap(),0,tls->wasctime_buffer);
+	HeapFree(GetProcessHeap(),0,tls->thread_strerrbuff);
     }
     HeapFree(GetProcessHeap(), 0, tls);
     TRACE("finished thread free\n");



More information about the wine-patches mailing list