330 lines
7.9 KiB
C
330 lines
7.9 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them 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.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these libraries and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
/*
|
|
* $TOG: util.c /main/6 1998/04/06 13:13:09 mgreess $
|
|
*
|
|
* @(#)util.c 1.21 16 Feb 1994 cde_app_builder/src/libAButil
|
|
*
|
|
* RESTRICTED CONFIDENTIAL INFORMATION:
|
|
*
|
|
* The information in this document is subject to special
|
|
* restrictions in a confidential disclosure agreement between
|
|
* HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
|
|
* document outside HP, IBM, Sun, USL, SCO, Fujitsu, or Univel without
|
|
* Sun's specific written approval. This document and all copies
|
|
* and derivative works thereof must be returned or destroyed at
|
|
* Sun's request.
|
|
*
|
|
* Copyright 1993 Sun Microsystems, Inc. All rights reserved.
|
|
*
|
|
*/
|
|
|
|
|
|
/*
|
|
* File: util.c - general utilities
|
|
*/
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <limits.h>
|
|
#include <sys/param.h>
|
|
#include <sys/utsname.h>
|
|
#include <ab_private/AB.h> /* include first! */
|
|
#include <ab_private/util.h>
|
|
#include <ab_private/istr.h>
|
|
#include "utilP.h"
|
|
|
|
static char *const util_verbosity_env_var_name= "AB_DEBUG_VERBOSITY";
|
|
static char *const default_program_name= "AppBuilder";
|
|
static ISTRING program_name= NULL;
|
|
|
|
const STRING Util_null_string= "(nil)";
|
|
const STRING Util_empty_string= "";
|
|
|
|
const int Util_major_version = 1;
|
|
const int Util_minor_version = 0;
|
|
|
|
int utilP_verbosity= 1;
|
|
|
|
|
|
/*
|
|
* argv0 may be NULL
|
|
*/
|
|
int
|
|
util_init(int *argc_in_out, STRING **argv_in_out)
|
|
{
|
|
#define argc (*argc_in_out)
|
|
#define argv (*argv_in_out)
|
|
STRING argv0 = argv[0];
|
|
char *verboseVar= NULL;
|
|
int verboseVarValue= -1;
|
|
int verbosity= 0;
|
|
|
|
verbosity = util_get_verbosity();
|
|
|
|
/*
|
|
* If this is a debugging build, look for the debugging level env. var
|
|
*/
|
|
#ifdef DEBUG
|
|
verboseVar= getenv(util_verbosity_env_var_name);
|
|
if (verboseVar != NULL)
|
|
{
|
|
verboseVarValue= atoi(verboseVar);
|
|
verbosity= verboseVarValue;
|
|
}
|
|
#endif /* DEBUG */
|
|
|
|
/*
|
|
* When debugging, keeps the output order consistent. A little
|
|
* slower, though.
|
|
*/
|
|
if (verbosity >= 3)
|
|
{
|
|
/* there's really no good reason to unbuffer stdin */
|
|
util_unbuffer_file(stdout);
|
|
util_unbuffer_file(stderr);
|
|
}
|
|
|
|
if (argv0 != NULL)
|
|
{
|
|
util_set_program_name_from_argv0(argv0);
|
|
}
|
|
|
|
if (verbosity >= 3)
|
|
{
|
|
util_puts("Debugging output enabled, because verbosity > 2.\n");
|
|
}
|
|
util_set_verbosity(verbosity);
|
|
verbosity= util_get_verbosity();
|
|
|
|
return 0;
|
|
#undef argc
|
|
#undef argv
|
|
}
|
|
|
|
|
|
int
|
|
util_set_verbosity(int newVerbosity)
|
|
{
|
|
int oldVerbosity = utilP_verbosity;
|
|
|
|
utilP_verbosity= newVerbosity;
|
|
|
|
/*
|
|
* If this is not a debugging build, do not allow verbosity to
|
|
* go outside the range that is normal for an end-user.
|
|
*/
|
|
#ifndef DEBUG
|
|
utilP_verbosity = util_max(0, utilP_verbosity);
|
|
utilP_verbosity = util_min(2, utilP_verbosity);
|
|
#endif
|
|
|
|
/*
|
|
* Nifty message if we're debugging.
|
|
*/
|
|
#ifdef DEBUG
|
|
if ( ((oldVerbosity >= 3) || (newVerbosity >= 3))
|
|
&& (oldVerbosity != newVerbosity) )
|
|
{
|
|
int newDebugLevel = debug_level();
|
|
utilP_verbosity = 3; /* make sure dprintf() prints something */
|
|
util_dprintf(0, "Verbosity = %d", newVerbosity);
|
|
if (newDebugLevel > 0)
|
|
{
|
|
util_dprintf(0," [ Debugging level %d ]", newDebugLevel);
|
|
}
|
|
util_dprintf(0,"\n");
|
|
utilP_verbosity = newVerbosity;
|
|
}
|
|
#endif /* DEBUG */
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
int
|
|
util_set_program_name(STRING new_program_name)
|
|
{
|
|
istr_destroy(program_name);
|
|
if (new_program_name == NULL)
|
|
{
|
|
program_name= istr_const(default_program_name);
|
|
}
|
|
else
|
|
{
|
|
program_name= istr_create(new_program_name);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
int
|
|
util_set_program_name_from_argv0(STRING argv0)
|
|
{
|
|
char progName[MAXPATHLEN];
|
|
util_get_file_name_from_path(argv0, progName, MAXPATHLEN);
|
|
if (strlen(progName) > (size_t)0)
|
|
{
|
|
util_set_program_name(progName);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
STRING
|
|
util_get_program_name(void)
|
|
{
|
|
return (program_name == NULL?
|
|
default_program_name
|
|
:istr_string(program_name));
|
|
}
|
|
|
|
|
|
/*
|
|
* Performs a lighter-weight fork that does not immediately copy
|
|
* all the pages of the application. This is ideal for doing a
|
|
* a fork and immediately execing another application.
|
|
*
|
|
* Not all UNIX implementations support a lightweight fork. For
|
|
* the ones that don't we'll do a normal fork.
|
|
*/
|
|
pid_t
|
|
util_vfork(void)
|
|
{
|
|
return fork();
|
|
}
|
|
|
|
|
|
/*
|
|
* putenv() is non-POSIX, so the parameter types can vary a bit...
|
|
*/
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#if defined(__hpux) || (defined(sun) && OSMAJORVERSION >= 5 && OSMINORVERSION >= 4 && OSMINORVERSION <=10 )
|
|
extern int putenv(const char *string);
|
|
#elif !(defined(__aix) || defined(__NetBSD__))
|
|
extern int putenv(char *string);
|
|
#endif
|
|
#ifdef __cplusplus
|
|
} // extern "C"
|
|
#endif
|
|
int
|
|
util_putenv(STRING string)
|
|
{
|
|
return putenv(string);
|
|
}
|
|
|
|
/*
|
|
*
|
|
*/
|
|
AB_OS_TYPE
|
|
util_get_os_type(void)
|
|
{
|
|
static AB_OS_TYPE osType = AB_OS_UNDEF;
|
|
static BOOL osTypeDefined = FALSE;
|
|
int rc = 0; /* return code */
|
|
struct utsname sysInfo;
|
|
int aixIndex = -1;
|
|
int hpIndex = -1;
|
|
int sunIndex = -1;
|
|
int lnxIndex = -1;
|
|
int fbsdIndex = -1;
|
|
int nbsdIndex = -1;
|
|
int obsdIndex = -1;
|
|
|
|
if (osTypeDefined)
|
|
{
|
|
goto epilogue;
|
|
}
|
|
if ((rc = uname(&sysInfo)) < 0)
|
|
{
|
|
goto epilogue;
|
|
}
|
|
|
|
aixIndex = util_strcasestr(sysInfo.sysname, "aix");
|
|
hpIndex = util_strcasestr(sysInfo.sysname, "hp");
|
|
sunIndex = util_strcasestr(sysInfo.sysname, "sun");
|
|
lnxIndex = util_strcasestr(sysInfo.sysname, "linux");
|
|
fbsdIndex = util_strcasestr(sysInfo.sysname, "freebsd");
|
|
nbsdIndex = util_strcasestr(sysInfo.sysname, "netbsd");
|
|
obsdIndex = util_strcasestr(sysInfo.sysname, "openbsd");
|
|
|
|
if (aixIndex < 0) aixIndex = INT_MAX;
|
|
if (hpIndex < 0) hpIndex = INT_MAX;
|
|
if (sunIndex < 0) sunIndex = INT_MAX;
|
|
if (lnxIndex < 0) lnxIndex = INT_MAX;
|
|
if (fbsdIndex < 0) fbsdIndex = INT_MAX;
|
|
if (nbsdIndex < 0) nbsdIndex = INT_MAX;
|
|
if (obsdIndex < 0) obsdIndex = INT_MAX;
|
|
|
|
#define IS_MATCH(a,b,c,d,e,f,g) \
|
|
(((a) < (b)) && ((a) < (c)) && ((a) < (d)) && ((a) < (e)) && ((a) < (f)) && \
|
|
((a) < (g)))
|
|
|
|
if (IS_MATCH(aixIndex, hpIndex, sunIndex, lnxIndex, fbsdIndex, nbsdIndex,
|
|
obsdIndex))
|
|
{
|
|
return AB_OS_AIX;
|
|
}
|
|
if (IS_MATCH(hpIndex, aixIndex, sunIndex, lnxIndex, fbsdIndex, nbsdIndex,
|
|
obsdIndex))
|
|
{
|
|
return AB_OS_HPUX;
|
|
}
|
|
if (IS_MATCH(sunIndex, aixIndex, hpIndex, lnxIndex, fbsdIndex, nbsdIndex,
|
|
obsdIndex))
|
|
{
|
|
return AB_OS_SUNOS;
|
|
}
|
|
if (IS_MATCH(lnxIndex, aixIndex, hpIndex, sunIndex, fbsdIndex, nbsdIndex,
|
|
obsdIndex))
|
|
{
|
|
return AB_OS_LNX;
|
|
}
|
|
if (IS_MATCH(fbsdIndex, aixIndex, hpIndex, sunIndex, lnxIndex, nbsdIndex,
|
|
obsdIndex))
|
|
{
|
|
return AB_OS_FBSD;
|
|
}
|
|
if (IS_MATCH(nbsdIndex, aixIndex, hpIndex, sunIndex, lnxIndex, fbsdIndex,
|
|
obsdIndex))
|
|
{
|
|
return AB_OS_NBSD;
|
|
}
|
|
if (IS_MATCH(obsdIndex, aixIndex, hpIndex, sunIndex, lnxIndex, fbsdIndex,
|
|
nbsdIndex))
|
|
{
|
|
return AB_OS_OBSD;
|
|
}
|
|
|
|
osTypeDefined = TRUE;
|
|
|
|
epilogue:
|
|
return osType;
|
|
}
|
|
|
|
|