ncls: add -L argument, skeleton for stat()

pull/1158/head
nick black 4 years ago committed by Nick Black
parent 65856c37b4
commit c733f33b81

@ -8,7 +8,7 @@ ncls - List paths with rendering of multimedia
# SYNOPSIS # SYNOPSIS
**ncls** [**-h**] [**-d**] [**-l**] [**-R**] [ paths ] **ncls** [**-h**] [**-d**] [**-l**] [**-L**] [**-R**] [ paths ]
# DESCRIPTION # DESCRIPTION
@ -21,6 +21,8 @@ ncls - List paths with rendering of multimedia
**-l**: use a long listing format. **-l**: use a long listing format.
**-L**: when showing file information for a symbolic link, show information for the file the link references rather than for the link itself.
**-R**: list subdirectories recursively. **-R**: list subdirectories recursively.
**-h**: Print help information, and exit with success. **-h**: Print help information, and exit with success.

@ -1,5 +1,7 @@
#include <cstdlib> #include <cstdlib>
#include <iostream> #include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
#include <ncpp/NotCurses.hh> #include <ncpp/NotCurses.hh>
@ -8,18 +10,77 @@ usage(std::ostream& os, const char* name, int code){
os << "usage: " << name << " -h | [ -lR ] paths...\n"; os << "usage: " << name << " -h | [ -lR ] paths...\n";
os << " -d: list directories themselves, not their contents\n"; os << " -d: list directories themselves, not their contents\n";
os << " -l: use a long listing format\n"; os << " -l: use a long listing format\n";
os << " -L: dereference symlink arguments\n";
os << " -R: list subdirectories recursively\n"; os << " -R: list subdirectories recursively\n";
os << " -h: print usage information\n"; os << " -h: print usage information\n";
os << std::flush; os << std::flush;
exit(code); exit(code);
} }
int main(int argc, char** argv){ // handle a single inode of arbitrary type
static int
handle_inode(const char* p, const struct stat* st, bool longlisting){
return 0;
}
// if |directories| is true, only print details of |p|, and return. otherwise,
// if |recursedirs| or |toplevel| is set, we will recurse, passing false as
// toplevel (but preserving |recursedirs|).
static int
handle_dir(const char* p, const struct stat* st, bool longlisting,
bool recursedirs, bool directories, bool toplevel){
if(directories){
return handle_inode(p, st, longlisting);
}
std::cout << "DIRECTORY: " << p << std::endl; // FIXME handle directory (recursedirs, directories)
return 0;
}
// handle a directory path *listed on the command line*.
static inline int
handle_cmdline_dir(const char* p, const struct stat* st, bool longlisting,
bool recursedirs, bool directories){
return handle_dir(p, st, longlisting, recursedirs, directories, true);
}
static int
handle_path(const char* p, bool longlisting, bool recursedirs,
bool directories, bool dereflinks){
struct stat st;
if(stat(p, &st)){
std::cerr << "Error running stat(" << p << "): " << strerror(errno) << std::endl;
return -1;
}
if((st.st_mode & S_IFMT) == S_IFDIR){
return handle_cmdline_dir(p, &st, longlisting, recursedirs, directories);
}else if((st.st_mode & S_IFMT) == S_IFLNK){
std::cout << p << std::endl; // FIXME handle symlink (dereflinks)
}else if((st.st_mode & S_IFMT) == S_IFREG){
std::cout << p << std::endl; // FIXME handle normal file
}else{
// FIXME handle weirdo
}
return 0;
}
static int
list_paths(const char* const * argv, bool longlisting, bool recursedirs,
bool directories, bool dereflinks){
int ret = 0;
while(*argv){
ret |= handle_path(*argv, longlisting, recursedirs, directories, dereflinks);
++argv;
}
return ret;
}
int main(int argc, char* const * argv){
bool longlisting = false; bool longlisting = false;
bool recursedirs = false; bool recursedirs = false;
bool directories = false; bool directories = false;
bool dereflinks = false;
int c; int c;
while((c = getopt(argc, argv, "dhlR")) != -1){ while((c = getopt(argc, argv, "dhlLR")) != -1){
switch(c){ switch(c){
case 'd': case 'd':
directories = true; directories = true;
@ -27,6 +88,9 @@ int main(int argc, char** argv){
case 'l': case 'l':
longlisting = true; longlisting = true;
break; break;
case 'L':
dereflinks = true;
break;
case 'R': case 'R':
recursedirs = true; recursedirs = true;
break; break;
@ -38,10 +102,8 @@ int main(int argc, char** argv){
break; break;
} }
} }
// FIXME if argv[optind] == nullptr, pass "." static const char* const default_args[] = { ".", nullptr };
while(argv[optind]){ list_paths(argv[optind] ? argv + optind : default_args, longlisting,
std::cout << "arg: " << argv[optind] << std::endl; recursedirs, directories, dereflinks);
++optind;
}
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

Loading…
Cancel
Save