fileiosym.cc #1

  • //
  • guest/
  • Newtopian/
  • p4/
  • 2014.1/
  • sys/
  • fileiosym.cc
  • View
  • Commits
  • Open Download .zip Download (2 KB)
/*
 * Copyright 1995, 1996 Perforce Software.  All rights reserved.
 *
 * This file is part of Perforce - the FAST SCM System.
 */

# define NEED_FILE
# define NEED_STAT

# include <stdhdrs.h>

# ifdef HAVE_SYMLINKS

# include <error.h>
# include <strbuf.h>
# include <debug.h>
# include <tunable.h>

# include "filesys.h"
# include "fileio.h"

# ifdef OS_NT
extern int nt_readlink( const char *name, char *buf, int sz );
extern int nt_makelink( const char *target, const char *name );
# define readlink(name,buf,sz) nt_readlink(name,buf,sz)
# define symlink(target,name) nt_makelink(target,name)
# endif

FileIOSymlink::~FileIOSymlink()
{
	Cleanup();
}

void
FileIOSymlink::Open( FileOpenMode mode, Error *e )
{
	offset = 0;
	value.Clear();
	this->mode = mode;

	// If reading, soak up the symlink now, to be passed back by Read().
	// Writing is done at close.

	if( mode == FOM_READ )
	{
	    int size = p4tunable.Get( P4TUNE_FILESYS_MAXSYMLINK );

	    int l = readlink( Name(), value.Alloc( size ), size );

	    if( l < 0 )
	    {
		e->Sys( "readlink", Name() );
		return;
	    }

	    value.SetLength( l );

	    // Append newline for prettiness.

	    value.Append( "\n" );
	}
}

void
FileIOSymlink::Write( const char *buf, int len, Error *e )
{
	// Just append to internal buffer.

	value.Append( buf, len );
}

int
FileIOSymlink::Read( char *buf, int len, Error *e )
{
	// Just read from internal buffer.
	// Offset tracks how much we have.
	
	int l = value.Length() - offset;

	if( len < l )
	    l = len;

	memcpy( buf, value.Text() + offset, l );

	offset += l;

	return l;
}

void
FileIOSymlink::Close( Error *e )
{
	if( mode == FOM_WRITE && value.Length() )
	{
	    // Strip newline added by Open().

	    char *p;

	    if( p = strchr( value.Text(), '\n' ) )
	    {
		value.SetEnd( p );
		value.Terminate();
	    }

	    if( symlink( value.Text(), Name() ) < 0 )
		e->Sys( "symlink", Name() );
	}

	// Prevent duplicate closes

	value.Clear();
}

void
FileIOSymlink::Truncate( Error *e )
{
}

int
FileIOSymlink::StatModTime()
{
# ifdef OS_NT
	int t = FileIO::StatModTime();
	return t >= 0 ? t : 0;
# else
	struct stat sb;

	if( lstat( Name(), &sb ) < 0 )
	    return 0;

	return (int)sb.st_mtime;
# endif
}

void
FileIOSymlink::Chmod( FilePerm perms, Error *e )
{
}

void
FileIOSymlink::ChmodTime( int modTime, Error *e )
{
}

# endif
# Change User Description Committed
#1 14945 Newtopian Merging

//guest/perforce_software/p4/...

to //guest/Newtopian/p4/...
//guest/perforce_software/p4/2014.1/sys/fileiosym.cc
#1 12188 Matt Attaway Move 'main' p4 into a release specific directory in prep for new releases
//guest/perforce_software/p4/sys/fileiosym.cc
#1 9129 Matt Attaway Initial commit of the 2014.1 p4/p4api source code