X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Fls.c;h=4d4714ee3fd4959172f0a97b2456c3c62c8c7a16;hp=1bea5f14e2b202df35213320415d34dd651c3f71;hb=afaff775c12f32b7912f194e2fcc8e76b8c82572;hpb=843514eef9dc6d04d71e031ba9ddb16e2beb9a04 diff --git a/daemon/ls.c b/daemon/ls.c index 1bea5f1..4d4714e 100644 --- a/daemon/ls.c +++ b/daemon/ls.c @@ -1,5 +1,5 @@ /* libguestfs - the guestfsd daemon - * Copyright (C) 2009 Red Hat Inc. + * Copyright (C) 2009 Red Hat Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,29 +23,66 @@ #include #include #include +#include #include #include "daemon.h" #include "actions.h" char ** -do_ls (const char *path) +do_ls (char *path) { - reply_with_error ("ls command is not yet implemented"); - return NULL; + char **r = NULL; + int size = 0, alloc = 0; + DIR *dir; + struct dirent *d; + + NEED_ROOT (NULL); + ABS_PATH (path, NULL); + + CHROOT_IN; + dir = opendir (path); + CHROOT_OUT; + + if (!dir) { + reply_with_perror ("opendir: %s", path); + return NULL; + } + + while ((d = readdir (dir)) != NULL) { + if (strcmp (d->d_name, ".") == 0 || strcmp (d->d_name, "..") == 0) + continue; + + if (add_string (&r, &size, &alloc, d->d_name) == -1) { + closedir (dir); + return NULL; + } + } + + if (add_string (&r, &size, &alloc, NULL) == -1) { + closedir (dir); + return NULL; + } + + if (closedir (dir) == -1) { + reply_with_perror ("closedir: %s", path); + free_strings (r); + return NULL; + } + + sort_strings (r, size-1); + return r; } char * -do_ll (const char *path) +do_ll (char *path) { - int r, len; + int r; char *out, *err; char *spath; - if (path[0] != '/') { - reply_with_error ("ll: path must start with a / character"); - return NULL; - } + //NEED_ROOT + ABS_PATH (path, NULL); /* This exposes the /sysroot, because we can't chroot and run the ls * command (since 'ls' won't necessarily exist in the chroot). This @@ -53,13 +90,11 @@ do_ll (const char *path) * interactive sessions. For the same reason, you can also "escape" * the sysroot (eg. 'll /..'). */ - len = strlen (path) + 9; - spath = malloc (len); + spath = sysroot_path (path); if (!spath) { reply_with_perror ("malloc"); return NULL; } - snprintf (spath, len, "/sysroot%s", path); r = command (&out, &err, "ls", "-la", spath, NULL); free (spath);