void RmDir(const char *path) { if(IsFile(path) || IsLnk(path)) { remove(path); return; } char filePath[PATH_MAX]; if(IsDir(path)) { DIR *dir; struct dirent *ptr; dir = opendir(path); while(ptr = readdir(dir)) { if(IsSpecial(ptr->d_name)) continue; GetFilePath(path,ptr->d_name,filePath); if(IsDir(filePath)) { RmDir(filePath); rmdir(filePath); } else if(IsFile(filePath) || IsLnk(filePath)) { remove(filePath); } } closedir(dir); } }
unicode_t* FSStat::GetModeStr( unicode_t buf[64] ) { unicode_t* p = buf; /* print type */ if ( IsLnk() ) { *p++ = '>'; } switch ( mode & S_IFMT ) { case S_IFDIR: /* directory */ *p++ = 'd'; break; case S_IFCHR: /* character special */ *p++ = 'c'; break; case S_IFBLK: /* block special */ *p++ = 'b'; break; case S_IFREG: /* regular */ *p++ = '-'; break; #ifdef S_IFLNK case S_IFLNK: /* symbolic link */ *p++ = 'l'; break; #endif #ifdef S_IFSOCK case S_IFSOCK: /* socket */ *p++ = 's'; break; #endif #ifdef S_IFIFO case S_IFIFO: /* fifo */ *p++ = 'p'; break; #endif default: /* unknown */ *p++ = '?'; break; } /* usr */ if ( mode & S_IRUSR ) { *p++ = 'r'; } else { *p++ = '-'; } if ( mode & S_IWUSR ) { *p++ = 'w'; } else { *p++ = '-'; } switch ( mode & ( S_IXUSR | S_ISUID ) ) { case 0: *p++ = '-'; break; case S_IXUSR: *p++ = 'x'; break; case S_ISUID: *p++ = 'S'; break; case S_IXUSR | S_ISUID: *p++ = 's'; break; } /* group */ if ( mode & S_IRGRP ) { *p++ = 'r'; } else { *p++ = '-'; } if ( mode & S_IWGRP ) { *p++ = 'w'; } else { *p++ = '-'; } switch ( mode & ( S_IXGRP | S_ISGID ) ) { case 0: *p++ = '-'; break; case S_IXGRP: *p++ = 'x'; break; case S_ISGID: *p++ = 'S'; break; case S_IXGRP | S_ISGID: *p++ = 's'; break; } /* other */ if ( mode & S_IROTH ) { *p++ = 'r'; } else { *p++ = '-'; } if ( mode & S_IWOTH ) { *p++ = 'w'; } else { *p++ = '-'; } switch ( mode & ( S_IXOTH | S_ISVTX ) ) { case 0: *p++ = '-'; break; case S_IXOTH: *p++ = 'x'; break; case S_ISVTX: *p++ = 'T'; break; case S_IXOTH | S_ISVTX: *p++ = 't'; break; } *p++ = ' '; /* will be a '+' if ACL's implemented */ *p = '\0'; return buf; }