[BACK]Return to var.c CVS log [TXT][DIR] Up to [Development] / xfs-cmds / xfsdump / dump

File: [Development] / xfs-cmds / xfsdump / dump / var.c (download)

Revision 1.7, Thu Dec 19 22:44:59 2002 UTC (14 years, 10 months ago) by nathans
Branch: MAIN
Changes since 1.6: +8 -8 lines

I18N support for xfsdump package.

/*
 * Copyright (c) 2000-2001 Silicon Graphics, Inc.  All Rights Reserved.
 * 
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 * 
 * This program is distributed in the hope that it would be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * 
 * Further, this software is distributed without any warranty that it is
 * free of the rightful claim of any third person regarding infringement
 * or the like.  Any license provided herein, whether implied or
 * otherwise, applies only to this software file.  Patent licenses, if
 * any, provided herein do not apply to combinations of this program with
 * other software, or any other product whatsoever.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write the Free Software Foundation, Inc., 59
 * Temple Place - Suite 330, Boston MA 02111-1307, USA.
 * 
 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
 * Mountain View, CA  94043, or:
 * 
 * http://www.sgi.com 
 * 
 * For further information regarding this notice, see: 
 * 
 * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
 */

#include <libxfs.h>
#include <jdm.h>

#include <sys/stat.h>
#include <errno.h>
#include <dirent.h>

#include "types.h"
#include "fs.h"
#include "openutil.h"
#include "mlog.h"
#include "global.h"
#include "inventory.h"

static void var_skip_recurse( char *, void ( * )( xfs_ino_t ));
static int  var_create_component( char * );

void
var_create( void )
{
	char path[PATH_MAX];
	char *p;

	p = strcpy( path, XFSDUMP_DIRPATH );
	mlog( MLOG_DEBUG, "creating directory %s\n", path );

	do {
		p++;
		if ( *p == '/' ) {
			*p = '\0';
			if ( ! var_create_component( path ) )
				return;
			*p = '/';
		}
	} while ( *p );

	( void ) var_create_component( path );
}

static int
var_create_component( char *path )
{
	int rval = mkdir( path, 0755 );

	if ( rval && errno != EEXIST ) {
		mlog( MLOG_NORMAL, _("unable to create %s: %s\n"),
		      path, strerror( errno ));
		return 0;
	}
	if ( rval == 0 ) {
		rval = chown( path, 0, 0 );
		if ( rval ) {
			mlog( MLOG_NORMAL, _("unable to chown %s: %s\n"),
			      path, strerror( errno ));
		}
	}
	return 1;
}

void
var_skip( uuid_t *dumped_fsidp, void ( *cb )( xfs_ino_t ino ))
{
	uuid_t fsid;
	intgen_t rval;

	/* see if the fs uuid's match
	 */
	rval = fs_getid( XFSDUMP_DIRPATH, &fsid );
	if ( rval ) {
#ifdef HIDDEN
                /* NOTE: this will happen for non-XFS file systems */
                /*       and is expected, so no msg */
		mlog( MLOG_NORMAL, _(
		      "unable to determine uuid of fs containing %s: "
		      "%s\n"),
		      XFSDUMP_DIRPATH,
		      strerror( errno ));
#endif
		return;
	}

	if ( uuid_compare( *dumped_fsidp, fsid ) != 0) {
		return;
	}

	/* traverse the xfsdump directory, getting inode numbers of it
	 * and all of its children, and reporting those to the callback.
	 */
	var_skip_recurse( XFSDUMP_DIRPATH, cb );
}

static void
var_skip_recurse( char *base, void ( *cb )( xfs_ino_t ino ))
{
	struct stat64 statbuf;
	DIR *dirp;
	struct dirent *direntp;
	intgen_t rval;

	rval = lstat64( base, &statbuf );
	if ( rval ) {
		mlog( MLOG_NORMAL, _(
		      "unable to get status of %s: %s\n"),
		      base,
		      strerror( errno ));
		return;
	}

	mlog( MLOG_DEBUG,
	      "excluding %s from dump\n",
	      base );

	( * cb )( statbuf.st_ino );

	if ( ( statbuf.st_mode & S_IFMT ) != S_IFDIR ) {
		return;
	}

	dirp = opendir( base );
	if ( ! dirp ) {
		mlog( MLOG_NORMAL, _(
		      "unable to open directory %s\n"),
		      base );
		return;
	}

	while ( ( direntp = readdir( dirp )) != NULL ) {
		char *path;

		/* skip "." and ".."
		 */
		if ( *( direntp->d_name + 0 ) == '.'
		     &&
		     ( *( direntp->d_name + 1 ) == 0
		       ||
		       ( *( direntp->d_name + 1 ) == '.'
			 &&
			 *( direntp->d_name + 2 ) == 0 ))) {
			continue;
		}

		path = open_pathalloc( base, direntp->d_name, 0 );
		var_skip_recurse( path, cb );
		free( ( void * )path );
	}

	closedir( dirp );
}