2005-01-06 21:22:44 +03:00
/*
* Copyright ( C ) 2001 - 2004 Sistina Software , Inc . All rights reserved .
2007-08-21 20:26:07 +04:00
* Copyright ( C ) 2004 - 2007 Red Hat , Inc . All rights reserved .
2005-01-06 21:22:44 +03:00
*
* This file is part of the device - mapper userspace tools .
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
2007-08-21 20:26:07 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2005-01-06 21:22:44 +03:00
*
2007-08-21 20:26:07 +04:00
* You should have received a copy of the GNU Lesser General Public License
2005-01-06 21:22:44 +03:00
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# include "lib.h"
# include <sys/file.h>
# include <fcntl.h>
# include <dirent.h>
2005-01-27 19:16:54 +03:00
2005-01-06 21:22:44 +03:00
static int _create_dir_recursive ( const char * dir )
{
char * orig , * s ;
2006-05-10 20:23:41 +04:00
int rc , r = 0 ;
2005-01-06 21:22:44 +03:00
log_verbose ( " Creating directory \" %s \" " , dir ) ;
/* Create parent directories */
2006-01-31 17:50:38 +03:00
orig = s = dm_strdup ( dir ) ;
2005-01-06 21:22:44 +03:00
while ( ( s = strchr ( s , ' / ' ) ) ! = NULL ) {
* s = ' \0 ' ;
if ( * orig ) {
rc = mkdir ( orig , 0777 ) ;
if ( rc < 0 & & errno ! = EEXIST ) {
2007-07-28 14:27:34 +04:00
if ( errno ! = EROFS )
log_sys_error ( " mkdir " , orig ) ;
2006-05-10 20:23:41 +04:00
goto out ;
2005-01-06 21:22:44 +03:00
}
}
* s + + = ' / ' ;
}
/* Create final directory */
rc = mkdir ( dir , 0777 ) ;
if ( rc < 0 & & errno ! = EEXIST ) {
2007-07-28 14:27:34 +04:00
if ( errno ! = EROFS )
log_sys_error ( " mkdir " , orig ) ;
2006-05-10 20:23:41 +04:00
goto out ;
2005-01-06 21:22:44 +03:00
}
2006-05-10 20:23:41 +04:00
r = 1 ;
out :
dm_free ( orig ) ;
return r ;
2005-01-06 21:22:44 +03:00
}
2007-07-28 14:48:36 +04:00
int dm_create_dir ( const char * dir )
2005-01-06 21:22:44 +03:00
{
struct stat info ;
if ( ! * dir )
return 1 ;
if ( stat ( dir , & info ) < 0 )
return _create_dir_recursive ( dir ) ;
if ( S_ISDIR ( info . st_mode ) )
return 1 ;
log_error ( " Directory \" %s \" not found " , dir ) ;
return 0 ;
}
2007-07-24 18:15:45 +04:00
int dm_fclose ( FILE * stream )
{
int prev_fail = ferror ( stream ) ;
int fclose_fail = fclose ( stream ) ;
/* If there was a previous failure, but fclose succeeded,
clear errno , since ferror does not set it , and its value
may be unrelated to the ferror - reported failure . */
if ( prev_fail & & ! fclose_fail )
errno = 0 ;
return prev_fail | | fclose_fail ? EOF : 0 ;
}