os_misc.c revision 9c8568743935f0892bb5bd33f5a5210bae53b8d3
1a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang/**************************************************************************
2a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang *
3a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * Copyright 2008-2010 Vmware, Inc.
4a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * All Rights Reserved.
5a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang *
6a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * Permission is hereby granted, free of charge, to any person obtaining a
7a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * copy of this software and associated documentation files (the
8a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * "Software"), to deal in the Software without restriction, including
9a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * without limitation the rights to use, copy, modify, merge, publish,
10a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * distribute, sub license, and/or sell copies of the Software, and to
11a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * permit persons to whom the Software is furnished to do so, subject to
12a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * the following conditions:
13a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang *
14a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * The above copyright notice and this permission notice (including the
15a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * next paragraph) shall be included in all copies or substantial portions
16a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * of the Software.
17a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang *
18a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang *
26a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang **************************************************************************/
27a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
28a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
29a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include "os_misc.h"
30a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
31a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include <stdarg.h>
32a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
33a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
34a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
35a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
36a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#ifndef WIN32_LEAN_AND_MEAN
37a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#define WIN32_LEAN_AND_MEAN      // Exclude rarely-used stuff from Windows headers
38a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif
39a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include <windows.h>
40a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include <stdio.h>
41a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
42a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#else
43a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
44a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include <stdio.h>
45a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#include <stdlib.h>
46a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
47a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif
48a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
49a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
50a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangvoid
51a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangos_log_message(const char *message)
52a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang{
53a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   /* If the GALLIUM_LOG_FILE environment variable is set to a valid filename,
54a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    * write all messages to that file.
55a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang    */
56a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   static FILE *fout = NULL;
57a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
58a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   if (!fout) {
59a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      /* one-time init */
60a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      const char *filename = os_get_option("GALLIUM_LOG_FILE");
61a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      if (filename)
62a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang         fout = fopen(filename, "w");
63a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      if (!fout)
64a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang         fout = stderr;
65a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   }
66a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
67a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
68a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   OutputDebugStringA(message);
69a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   if(GetConsoleWindow() && !IsDebuggerPresent()) {
70a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      fflush(stdout);
71a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      fputs(message, fout);
72a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      fflush(fout);
73a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   }
74a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   else if (fout != stderr) {
75a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      fputs(message, fout);
76a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang      fflush(fout);
77a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   }
78a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#else /* !PIPE_SUBSYSTEM_WINDOWS */
79a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   fflush(stdout);
80a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   fputs(message, fout);
81a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   fflush(fout);
82a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang#endif
83a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang}
84a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
85a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
86a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangconst char *
87a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wangos_get_option(const char *name)
88a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang{
89a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang   return getenv(name);
90a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang}
91a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang
92a2b9955b49034a51dfbc8bf9f4e9d312149cecacXianzhu Wang