/*************************************************************** SYS-MKDIR.C This file contains Linux/i386/ILP32 implementation of __cpu_sys_mkdir(). PART OF : CPU - library . USAGE : Internal only . Copyright (C) 2026 by Andrew V.Kosteltsev. All Rights Reserved. ***************************************************************/ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include static int __cpu_mkdir_mode( __mpu_uint64_t mode, mode_t *host_mode ) { mode_t m = 0; if( !host_mode ) return( __MCPU_EINVAL ); if( mode & ~(__mpu_uint64_t)__CPU_S_SUPPORTED ) return( __MCPU_EINVAL ); if( mode & __CPU_S_ISUID ) m |= S_ISUID; if( mode & __CPU_S_ISGID ) m |= S_ISGID; #ifdef S_ISVTX if( mode & __CPU_S_ISVTX ) m |= S_ISVTX; #endif if( mode & __CPU_S_IRUSR ) m |= S_IRUSR; if( mode & __CPU_S_IWUSR ) m |= S_IWUSR; if( mode & __CPU_S_IXUSR ) m |= S_IXUSR; if( mode & __CPU_S_IRGRP ) m |= S_IRGRP; if( mode & __CPU_S_IWGRP ) m |= S_IWGRP; if( mode & __CPU_S_IXGRP ) m |= S_IXGRP; if( mode & __CPU_S_IROTH ) m |= S_IROTH; if( mode & __CPU_S_IWOTH ) m |= S_IWOTH; if( mode & __CPU_S_IXOTH ) m |= S_IXOTH; *host_mode = m; return( 0 ); } /* End of __cpu_mkdir_mode() */ __mpu_int64_t __cpu_sys_mkdir( int dirfd, const char *path, __mpu_uint64_t mode ) { mode_t host_mode; int error; if( !path ) return( -(__mpu_int64_t)__MCPU_EFAULT ); error = __cpu_mkdir_mode( mode, &host_mode ); if( error ) return( -(__mpu_int64_t)error ); if( mkdirat( dirfd, path, host_mode ) < 0 ) return( -(__mpu_int64_t)__cpu_errno_from_host( errno ) ); return( 0 ); } /* End of __cpu_sys_mkdir() */