summaryrefslogtreecommitdiffstats
path: root/daemon/file.c
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2010-06-04 11:23:01 +0100
committerRichard Jones <rjones@redhat.com>2010-06-04 11:23:01 +0100
commite3befe5a2e85179dcc5a52aa7d74b9cc5f3430ec (patch)
tree729dba8a95d283d38a11627cc585f35fe1dec415 /daemon/file.c
parent32f48cc3330a50b7b9e2af7db0f0470da209bb6f (diff)
downloadlibguestfs-e3befe5a2e85179dcc5a52aa7d74b9cc5f3430ec.tar.gz
libguestfs-e3befe5a2e85179dcc5a52aa7d74b9cc5f3430ec.tar.xz
libguestfs-e3befe5a2e85179dcc5a52aa7d74b9cc5f3430ec.zip
daemon: Rearrange code in 'file' command.
path = path to access file (/sysroot/.. or /dev/..) display_path = original path, saved so we can display it buf = optional buffer which is freed along return codepaths There should be no change to the semantics of the code.
Diffstat (limited to 'daemon/file.c')
-rw-r--r--daemon/file.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/daemon/file.c b/daemon/file.c
index 76000645..2594207f 100644
--- a/daemon/file.c
+++ b/daemon/file.c
@@ -512,20 +512,18 @@ do_pwrite (const char *path, const char *content, size_t size, int64_t offset)
char *
do_file (const char *path)
{
- char *out, *err;
- int r, freeit = 0;
- char *buf;
- int len;
+ char *buf = NULL;
+ const char *display_path = path;
- if (STREQLEN (path, "/dev/", 5))
- buf = (char *) path;
- else {
+ int is_dev = STRPREFIX (path, "/dev/");
+
+ if (!is_dev) {
buf = sysroot_path (path);
if (!buf) {
reply_with_perror ("malloc");
return NULL;
}
- freeit = 1;
+ path = buf;
}
/* file(1) manpage claims "file returns 0 on success, and non-zero on
@@ -533,26 +531,27 @@ do_file (const char *path)
* every scenario I can think up. So check the target is readable
* first.
*/
- if (access (buf, R_OK) == -1) {
- if (freeit) free (buf);
- reply_with_perror ("access: %s", path);
+ if (access (path, R_OK) == -1) {
+ reply_with_perror ("access: %s", display_path);
+ free (buf);
return NULL;
}
- r = command (&out, &err, "file", "-zbsL", buf, NULL);
- if (freeit) free (buf);
+ char *out, *err;
+ int r = command (&out, &err, "file", "-zbsL", path, NULL);
+ free (buf);
if (r == -1) {
free (out);
- reply_with_error ("%s: %s", path, err);
+ reply_with_error ("%s: %s", display_path, err);
free (err);
return NULL;
}
free (err);
/* We need to remove the trailing \n from output of file(1). */
- len = strlen (out);
- if (out[len-1] == '\n')
+ size_t len = strlen (out);
+ if (len > 0 && out[len-1] == '\n')
out[len-1] = '\0';
return out; /* caller frees */