quantum-espresso/clib/c_mkdir.c

101 lines
2.4 KiB
C

/*
Copyright (C) 2003-2007 Quantum ESPRESSO group
This file is distributed under the terms of the
GNU General Public License. See the file `License'
in the root directory of the present distribution,
or http://www.gnu.org/copyleft/gpl.txt .
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <errno.h>
#include <time.h>
#include "c_defs.h"
static void fatal ( const char * msg )
{
fprintf( stderr , "fatal: %s" , *msg ? msg : "Oops!" ) ;
exit( -1 ) ;
} /* fatal */
static void * xcmalloc ( size_t size )
{
register void * ptr = malloc( size ) ;
if ( ptr == NULL )
fatal( "c_mkdir: virtual memory exhausted" ) ;
else
memset( ptr , 0 , size ) ;
return ptr ;
} /* xcmalloc */
int F77_FUNC_(c_mkdir_int,C_MKDIR_INT)( const int * dirname , const int * length )
{
int i, retval = -1 ;
mode_t mode = 0777 ;
char * ldir = ( char * ) xcmalloc( (*length) + 1 ) ;
for( i = 0; i < * length; i++ ) ldir[ i ] = (char)dirname[ i ];
ldir[*length] = '\0' ; /* memset() in xcmalloc() already do this */
retval = mkdir( ldir , mode ) ;
if ( retval == -1 && errno != EEXIST )
fprintf( stderr , "mkdir fail: [%d] %s\n" , errno , strerror( errno ) ) ;
free( ldir ) ;
return retval ;
} /* c_mkdir */
/* call from fortran as
ios = c_remame ( integer old-file-name(:), integer old-file-name, &
integer new-file-name(:), integer new-file-name )
renames file old-file-name into new-file-name (don't try this on open files!)
ios should return 0 if everything is ok, -1 otherwise.
Written by PG by imitating "c_mkdir" without really understanding it */
int F77_FUNC_(c_rename_int,C_RENAME_INT)( const int * oldname, const int * oldlength ,
const int * newname, const int * newlength )
{
int i, retval = -1 ;
char * oldname_ = ( char * ) xcmalloc( (*oldlength) + 1 ) ;
char * newname_ = ( char * ) xcmalloc( (*newlength) + 1 ) ;
for( i = 0; i < * oldlength; i++ ) oldname_[ i ] = (char)oldname[ i ];
for( i = 0; i < * newlength; i++ ) newname_[ i ] = (char)newname[ i ];
oldname_[*oldlength] = '\0' ;
newname_[*newlength] = '\0' ;
retval = rename( oldname_, newname_ ) ;
if ( retval == -1 )
fprintf( stderr , "mv fail: [%d] %s\n" , errno , strerror( errno ) ) ;
free( oldname_ ) ;
free( newname_ ) ;
return retval ;
} /* c_rename */
/* EOF */