/*- * Copyright (c) 2002-2018 The UbixOS Project. * All rights reserved. * * This was developed by Christopher W. Olsen for the UbixOS Project. * * Redistribution and use in source and binary forms, with or without modification, are permitted * provided that the following conditions are met: * * 1) Redistributions of source code must retain the above copyright notice, this list of * conditions, the following disclaimer and the list of authors. * 2) Redistributions in binary form must reproduce the above copyright notice, this list of * conditions, the following disclaimer and the list of authors in the documentation and/or * other materials provided with the distribution. * 3) Neither the name of the UbixOS Project nor the names of its contributors may be used to * endorse or promote products derived from this software without specific prior written * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <unistd.h> #define permRead 0x8 #define permWrite 0x4 #define permExecute 0x2 #define permHidden 0x1 //UbixFS Directory Entry struct directoryEntry { uint32_t startCluster; //Starting Cluster Of File uint32_t size; //Size Of File uint32_t creationDate; //Date Created uint32_t lastModified; //Date Last Modified uint32_t uid; //UID Of Owner uint32_t gid; //GID Of Owner uint16_t attributes; //Files Attributes uint16_t permissions; //Files Permissions char fileName[256]; //File Name }; #define typeFile 1 #define typeContainer 2 #define typeDirectory 4 #define typeDeleted 8 int main(int argc,char **argv) { int i = 0x0,x = 0x0,tmpPerms = 0x0; char *pwd = 0x0; char *permsData = 0x0; FILE *fd; struct directoryEntry *dirEntry = 0x0; unsigned int *segbase = 0x0; __asm __volatile("movl %%gs:0, %0" : "=r" (segbase)); printf("Segbase: 0x%X - 0x%X\n", segbase, &segbase); printf("argc: %i - %i\n", argc, argv[0]); exit(0); pwd = (char *)malloc(256); permsData = (char *)malloc(13); if (argv == 0x0) { getcwd(pwd,256); printf("PWD1: %s\n", pwd); if ((fd = fopen(pwd,"rb")) == 0x0) { printf("Error: Reading Directory\n"); exit(1); } } else if (argv[1] == 0x0) { getcwd(pwd,256); printf("PWD2: %s\n", pwd); if ((fd = fopen(pwd,"rb")) == 0x0) { printf("Error: Reading Directory\n"); exit(1); } } else { getcwd(pwd,256); printf("PWD3: %s\n", pwd); fd = fopen(argv[1],"rb"); if (fd->fd == 0x0) { printf("Error: Reading Directory\n"); exit(1); } } dirEntry = (struct directoryEntry *)malloc(fd->size); fread(dirEntry,fd->size,1,fd); pwd[0] = '/'; for (i=0;i<(fd->size/sizeof(struct directoryEntry));i++) { printf("[fN: %s]", dirEntry[i].fileName); if ((dirEntry[i].fileName[0] > 0) && (dirEntry[i].fileName[0] != '/')) { for (x=0;x<12;x++) { permsData[x] = '-'; } if ((dirEntry[i].attributes & typeDeleted) == typeDeleted) { permsData[0] = 'd'; goto next; } else if ((dirEntry[i].attributes & typeFile) == typeFile) { permsData[0] = 'F'; } else if ((dirEntry[i].attributes & typeDirectory) == typeDirectory) { permsData[0] = 'D'; } else if ((dirEntry[i].attributes & typeContainer) == typeContainer) { permsData[0] = '@'; } else { permsData[0] = 'U'; } tmpPerms = ((dirEntry[i].permissions & 0xF00) >> 8); if ((tmpPerms & permRead) == permRead) permsData[1] = 'R'; if ((tmpPerms & permWrite) == permWrite) permsData[2] = 'W'; if ((tmpPerms & permExecute) == permExecute) permsData[3] = 'E'; if ((tmpPerms & permHidden) == permHidden) permsData[4] = 'H'; tmpPerms = ((dirEntry[i].permissions & 0x0F0) >> 4); if ((tmpPerms & permRead) == permRead) permsData[5] = 'R'; if ((tmpPerms & permWrite) == permWrite) permsData[6] = 'W'; if ((tmpPerms & permExecute) == permExecute) permsData[7] = 'E'; if ((tmpPerms & permHidden) == permHidden) permsData[8] = 'H'; tmpPerms = ((dirEntry[i].permissions & 0x00F) >> 0); if ((tmpPerms & permRead) == permRead) permsData[9] = 'R'; if ((tmpPerms & permWrite) == permWrite) permsData[10] = 'W'; if ((tmpPerms & permExecute) == permExecute) permsData[11] = 'E'; if ((tmpPerms & permHidden) == permHidden) permsData[12] = 'H'; printf("%s %i %i %i %s\n",permsData,(int)dirEntry[i].uid,(int)dirEntry[i].gid,(int)dirEntry[i].size,dirEntry[i].fileName); next: asm("nop"); } } if (fclose(fd) != 0x0) { printf("Error Closing Directory\n"); } return(0); }