/***************************************************************************** * config_CreateDir: Create configuration directory if it doesn't exist. *****************************************************************************/ int config_CreateDir( vlc_object_t *p_this, const char *psz_dirname ) { if( !psz_dirname || !*psz_dirname ) return -1; if( vlc_mkdir( psz_dirname, 0700 ) == 0 ) return 0; switch( errno ) { case EEXIST: return 0; case ENOENT: { /* Let's try to create the parent directory */ char psz_parent[strlen( psz_dirname ) + 1], *psz_end; strcpy( psz_parent, psz_dirname ); psz_end = strrchr( psz_parent, DIR_SEP_CHAR ); if( psz_end && psz_end != psz_parent ) { *psz_end = '\0'; if( config_CreateDir( p_this, psz_parent ) == 0 ) { if( !vlc_mkdir( psz_dirname, 0700 ) ) return 0; } } } } msg_Warn( p_this, "could not create %s: %m", psz_dirname ); return -1; }
static void ArtCacheCreateDir( const char *psz_dir ) { char newdir[strlen( psz_dir ) + 1]; strcpy( newdir, psz_dir ); char * psz_newdir = newdir; char * psz = psz_newdir; while( *psz ) { while( *psz && *psz != DIR_SEP_CHAR) psz++; if( !*psz ) break; *psz = 0; if( !EMPTY_STR( psz_newdir ) ) vlc_mkdir( psz_newdir, 0700 ); *psz = DIR_SEP_CHAR; psz++; } vlc_mkdir( psz_dir, 0700 ); }
/* Recursive make directory * Abort if you get an ENOENT errno somewhere in the middle * e.g. ignore error "mkdir on existing directory" * * return 1 if OK, 0 on error */ int makedir( const char *newdir ) { char *p, *buffer = strdup( newdir ); int len = strlen( buffer ); if( len <= 0 ) { free( buffer ); return 0; } if( buffer[len-1] == '/' ) { buffer[len-1] = '\0'; } if( vlc_mkdir( buffer, 0775 ) == 0 ) { free( buffer ); return 1; } p = buffer + 1; while( 1 ) { char hold; while( *p && *p != '\\' && *p != '/' ) p++; hold = *p; *p = 0; if( ( vlc_mkdir( buffer, 0775 ) == -1 ) && ( errno == ENOENT ) ) { fprintf( stderr, "couldn't create directory %s\n", buffer ); free( buffer ); return 0; } if( hold == 0 ) break; *p++ = hold; } free( buffer ); return 1; }