Xv6 with picoc & Linkage editor
v1.0
The project delineate mutual cohesion between c library, linkage editor ( linker), interpreter and operating system by porting the same on xv6 kernel
|
00001 #include "types.h" 00002 #include "stat.h" 00003 #include "user.h" 00004 #include "fs.h" 00005 00006 char* 00007 fmtname(char *path) 00008 { 00009 static char buf[DIRSIZ+1]; 00010 char *p; 00011 00012 // Find first character after last slash. 00013 for(p=path+strlen(path); p >= path && *p != '/'; p--) 00014 ; 00015 p++; 00016 00017 // Return blank-padded name. 00018 if(strlen(p) >= DIRSIZ) 00019 return p; 00020 memmove(buf, p, strlen(p)); 00021 memset(buf+strlen(p), ' ', DIRSIZ-strlen(p)); 00022 return buf; 00023 } 00024 00025 void 00026 ls(char *path) 00027 { 00028 char buf[512], *p; 00029 int fd; 00030 struct dirent de; 00031 struct stat st; 00032 00033 if((fd = open(path, 0)) < 0){ 00034 printf( "ls: cannot open %s\n", path); 00035 return; 00036 } 00037 00038 if(fstat(fd, &st) < 0){ 00039 printf( "ls: cannot stat %s\n", path); 00040 close(fd); 00041 return; 00042 } 00043 00044 switch(st.type){ 00045 case T_FILE: 00046 printf( "%s %d %d %d\n", fmtname(path), st.type, st.ino, st.size); 00047 break; 00048 00049 case T_DIR: 00050 if(strlen(path) + 1 + DIRSIZ + 1 > sizeof buf){ 00051 printf( "ls: path too long\n"); 00052 break; 00053 } 00054 strcpy(buf, path); 00055 p = buf+strlen(buf); 00056 *p++ = '/'; 00057 while(read(fd, &de, sizeof(de)) == sizeof(de)){ 00058 if(de.inum == 0) 00059 continue; 00060 memmove(p, de.name, DIRSIZ); 00061 p[DIRSIZ] = 0; 00062 if(stat(buf, &st) < 0){ 00063 printf( "ls: cannot stat %s\n", buf); 00064 continue; 00065 } 00066 printf( "%s %d %d %d\n", fmtname(buf), st.type, st.ino, st.size); 00067 } 00068 break; 00069 } 00070 close(fd); 00071 } 00072 00073 int 00074 main(int argc, char *argv[]) 00075 { 00076 int i; 00077 00078 if(argc < 2){ 00079 ls("."); 00080 exit(1); 00081 } 00082 for(i=1; i<argc; i++) 00083 ls(argv[i]); 00084 exit(1); 00085 }