hostenv.cc #1

  • //
  • guest/
  • perforce_software/
  • p4/
  • 2014-1/
  • sys/
  • hostenv.cc
  • View
  • Commits
  • Open Download .zip Download (7 KB)
/*
 * Copyright 1995, 1996 Perforce Software.  All rights reserved.
 *
 * This file is part of Perforce - the FAST SCM System.
 */

/*
 * Hostenv.cc - describe user's environment
 */

# define NEED_GETCWD
# define NEED_GETHOSTNAME
# define NEED_GETPWUID

# include <stdhdrs.h>
# include <strbuf.h>
# include "hostenv.h"
# include <i18napi.h>
# include <charcvt.h>
# include <enviro.h>

# ifdef OS_NT
# define WIN32_LEAN_AND_MEAN
# include <windows.h>
# include <ntmangle.h>
# include <wchar.h>
# include <lmcons.h>
# endif

# ifdef OS_VMS
# define CWD_VAR "PATH"
# else
# define CWD_VAR "PWD"
# endif

# if defined( OS_NT ) || defined( OS_OS2 )
# define USER_VAR "USERNAME"
# else
# define USER_VAR "USER"
# endif

int
HostEnv::GetHost( StrBuf &result )
{

	// host - hostname

	result.Clear();
	result.Alloc( 64 );

# ifdef HAVE_GETHOSTNAME
	if( gethostname( result.Text(), result.Length() ) >= 0 )
	{
	    result.SetLength();
	    return 1;
	}
# endif

# ifdef OS_NT 
	unsigned long buflen = result.Length();
 	if( GetComputerName( result.Text(), &buflen ) ) 
	{
	    result.SetLength();
	    return 1;
	}
# endif 

# if defined( OS_NT ) || defined( OS_OS2 )
	char *c;

	if( c = getenv( "COMPUTERNAME" ) )
	{
	    result.Set( c );
	    return 1;
	}
# endif

	return 0;
}

/*
 * GetEnv() - get a value from the environment, using Unicode API or not
 */

# ifdef OS_NT
static void lowerCaseDrive( char *path83 )
{
	// Make sure that the drive letter is lower case.
	if( path83[0] && path83[1] == ':' )
	{
		if( path83[0] >= 'A' && path83[0] <= 'Z' )
			path83[0] = 'a' + ( path83[0] - 'A' );
	}
}
static void
GetCwd( StrBuf *dest, int charset = 0 )
{
	CHAR cwd[_MAX_PATH];
	if( !CharSetApi::isUnicode( (CharSetApi::CharSet)charset ) )
	{
		getcwd( cwd, _MAX_PATH );
		dest->Clear();
		int len = GetLongPathName( cwd, dest->Alloc( _MAX_PATH ), _MAX_PATH );

		if( len > _MAX_PATH )
		{
			dest->Clear();
			len = GetLongPathName( cwd, dest->Alloc( len ), len );
		}

		if( len == 0 )
		{
			dest->Clear();
			dest->Set( cwd );
		}
		else
			dest->SetLength();

		lowerCaseDrive( dest->Text() );
		return;
	}

	WCHAR wcwd[_MAX_PATH];
	if( !_wgetcwd( wcwd, _MAX_PATH ) )
		return;

	WCHAR wlcwd[_MAX_PATH];
	int len = GetLongPathNameW( wcwd, wlcwd, _MAX_PATH );

	WCHAR *wrcwd = wlcwd;

	if( len > _MAX_PATH || len == 0 )
	{
		wrcwd = wcwd;
		len = wcslen( wcwd );
	}

	CharSetCvtUTF168 cvtval;
	const char *retval = cvtval.FastCvt( (const char *)wrcwd, 2 * len );
	if( !retval )
		return;	// should not happen
	dest->Set( retval );
	lowerCaseDrive( dest->Text() );
}
#else
static void
GetCwd( StrBuf *dest, int = 0 )
{
	dest->Clear();
	dest->Alloc( 256 );
	getcwd( dest->Text(), dest->Length() );
	dest->SetLength();
}
#endif

int
HostEnv::GetCwd( StrBuf &result, Enviro * enviro )
{
	Enviro *tmpenviro = NULL;

	if( !enviro )
	    enviro = tmpenviro = new Enviro;

	char *c;

	if( c = enviro->Get( CWD_VAR ) )
	{
	    result.Set( c );
	    delete tmpenviro;
	    return 1;
	}

	::GetCwd( &result, enviro->GetCharSet() );

	delete tmpenviro;

	return 1;
}

int
HostEnv::GetUser( StrBuf &result, Enviro * enviro )
{
	// user - user's name

	Enviro * tmpenviro = NULL;

	if( !enviro )
	    enviro = tmpenviro = new Enviro;

	char *c;

	if( c = enviro->Get( USER_VAR ) )
	{
	    result.Set( c );
	    delete tmpenviro;
	    return 1;
	}

# ifdef OS_NT
	if( CharSetApi::isUnicode( (CharSetApi::CharSet)enviro->GetCharSet() ) )
	{
	    WCHAR wuser[UNLEN+1];
	    DWORD wlength = sizeof(wuser) / sizeof(WCHAR);
	    if( GetUserNameW( wuser,  &wlength ) )
	    {
		CharSetCvtUTF168 cvtval;
		const char *retval = 
			cvtval.FastCvt( (const char *)wuser, 2 * wlength - 2 );
		if( retval )
		{
		    result.Set( retval );
		    delete tmpenviro;
		    return 1;
		}
	    }
	}
	else
	{
	    result.Clear();
	    result.Alloc( 128 );
	    DWORD length = result.Length();
	    if( GetUserNameA( result.Text(), &length ) )
	    {
		result.SetLength();
		delete tmpenviro;
		return 1;
	    }
	}
# endif

# ifdef HAVE_GETPWUID
	struct passwd *pwd;
	if( pwd = getpwuid( getuid() ) )
	{
	    result.Set( pwd->pw_name );
	    delete tmpenviro;
	    return 1;
	}
# endif

# ifdef OS_BEOS
	result.Clear();
	result.Alloc( 128 );
	if( getusername( result.Text(), result.Length() ) )
	{
	    result.SetLength();
	    delete tmpenviro;
	    return 1;
	}
# endif /* OS_BEOS */

	delete tmpenviro;

	return 0;
}

int
HostEnv::GetTicketFile( StrBuf &result, Enviro * enviro )
{
	return GetHomeName( StrRef( "p4tickets" ), result, 
	                    enviro, "P4TICKETS" );
}

int
HostEnv::GetTrustFile( StrBuf &result, Enviro * enviro )
{
	return GetHomeName( StrRef( "p4trust" ), result, 
	                    enviro, "P4TRUST" );
}

int
HostEnv::GetHomeName( 
	const StrRef &name, 
	StrBuf &result, 
	Enviro *enviro,
	const char *varName )
{

	Enviro * tmpenviro = NULL;

	if( !enviro )
	    tmpenviro = enviro = new Enviro;

	// Set in the environment ?

	const char *setInEnv = enviro->Get( varName );

	if( setInEnv )
	{
	    result.Set( setInEnv );
	    delete tmpenviro;
	    return 1;
	}

# ifdef OS_NT
# define HAVE_TICKETS

        // On NT, try looking in $USERPROFILE, if no luck stash in the
        // windows directory.

	const char *home = enviro->Get( "USERPROFILE" );
                                                                                
	if( home )
	    result.Set( home );
	else
	{
	    int length;
	    char buffer[MAX_PATH];
	    WCHAR wbuffer[MAX_PATH];

	    if( !CharSetApi::isUnicode( (CharSetApi::CharSet)enviro->GetCharSet() ) && 
		GetWindowsDirectoryA( buffer, sizeof( buffer ) ) )
	    {
	        result.Set( buffer );
	    }
	    else if( length = GetWindowsDirectoryW( wbuffer, sizeof( wbuffer )/sizeof( WCHAR ) ) )
	    {
		CharSetCvtUTF168 cvtval;
		const char *retval = 
			cvtval.FastCvt( (const char *)wbuffer, sizeof( WCHAR ) * length );
		if( retval )
		    result.Set( retval );
	    }
	}
                                                                                
	if( result.Length() )
	{
	    result.Append( "\\" );
	    result.Append( &name );
	    result.Append( ".txt" );
	}

# endif

# ifdef OS_VMS
# define HAVE_TICKETS

	const char *home = enviro->Get( "HOME" );
 
	if( home )
	{
	    result.Set( home );
	    result.Append( &name );
	    result.Append( ".txt" );
	}

# endif

# ifndef HAVE_TICKETS

	const char *home = enviro->Get( "HOME" );
 
	if( home )
	{
	    result.Set( home );
	    result.Append( "/." );
	    result.Append( &name );
	}

# endif

	delete tmpenviro;

	return( result.Length() ? 1 : 0 );
}

int
HostEnv::GetUid( int &result )
{
# ifdef HAVE_GETPWUID
	struct passwd *pwd;
	if( pwd = getpwuid( getuid() ) )
	{
	    result = pwd->pw_uid;
	    return 1;
	}
# endif

	return 0;
}
# Change User Description Committed
#1 15902 Matt Attaway A second renaming that I will not obliterate as a badge of shame
//guest/perforce_software/p4/2014_1/sys/hostenv.cc
#1 15901 Matt Attaway Clean up code to fit modern Workshop naming standards
//guest/perforce_software/p4/2014.1/sys/hostenv.cc
#1 12188 Matt Attaway Move 'main' p4 into a release specific directory in prep for new releases
//guest/perforce_software/p4/sys/hostenv.cc
#1 9129 Matt Attaway Initial commit of the 2014.1 p4/p4api source code