diff --git a/ls.go b/ls.go new file mode 100644 index 0000000..42cadd1 --- /dev/null +++ b/ls.go @@ -0,0 +1,76 @@ +package main + +import ( + "io/ioutil" + "fmt" + "flag" + "log" + "syscall" + "strconv" +) + + +func get_fileinfo(f string, size bool, mode bool, inode bool) string{ + var stat syscall.Stat_t + var ret string + ret = "{\"name\":\"" + f + "\"" + if err := syscall.Stat(f, &stat); err != nil { + log.Fatal(err) + } + if(size){ + ret = ret + ", \"size\":" + strconv.FormatInt(stat.Size,10) + } + if(mode){ + ret = ret + ", \"mode\":" + strconv.Itoa(int(stat.Mode)) + } + if(inode){ + ret = ret + ", \"inode\":" + strconv.FormatUint(stat.Ino,10) + } + ret = ret + "}" + return ret +} + +func main() { + // here be the ls flags + + var a_flag bool // all files, even ones starting with . + var mode_flag bool // flags + var inode_flag bool // inode + var size_flag bool // size + var first = true + + flag.BoolVar(&a_flag, "a", false, "lists all files in directory, even hidden ones") + flag.BoolVar(&mode_flag, "f", false, "include flags for file") + flag.BoolVar(&inode_flag, "i", false, "include flags for file") + flag.BoolVar(&size_flag, "s", false, "include flags for file") + // end ls flag + + flag.Parse() + root := "."//flag.Arg(0) + dir,_ := ioutil.ReadDir(root) + + fmt.Printf("[\n") + + if(!a_flag){ + for _,entry := range dir{ + if(entry.Name()[0]!='.'){ + if(!first){ + fmt.Printf(",") + }else{ + first = false + } + fmt.Printf("%s\n", get_fileinfo(entry.Name(), size_flag, mode_flag, inode_flag)) + } + } + }else{ + for _,entry := range dir{ + if(!first){ + fmt.Printf(",") + }else{ + first = false + } + fmt.Printf("%s\n", get_fileinfo(entry.Name(), size_flag, mode_flag, inode_flag)) + } + } + fmt.Printf("]\n") +}