[libvirt] [PATCH 2/2] build: fix getcwd portability problems

Eric Blake eblake at redhat.com
Fri Apr 29 17:29:31 UTC 2011


* bootstrap.conf (gnulib_modules): Add getcwd-lgpl.
* tests/commandtest.c (checkoutput): Drop unused cwd.
* tests/commandhelper.c (main): Let getcwd malloc.
* tests/testutils.c (virTestMain): Likewise.
* tools/virsh.c (cmdPwd): Likewise.
(virshCmds): Expose cmdPwd and cmdCd on mingw.
---

> Oh, and now that gnulib getcwd-lgpl exists, we could use it
> to fix our uses of getcwd(NULL,0), followup coming later.

 bootstrap.conf        |    1 +
 tests/commandhelper.c |    7 ++++---
 tests/commandtest.c   |    4 ----
 tests/testutils.c     |    3 +--
 tools/virsh.c         |   34 ++++++++--------------------------
 5 files changed, 14 insertions(+), 35 deletions(-)

diff --git a/bootstrap.conf b/bootstrap.conf
index 3b3a90f..fde00da 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -36,6 +36,7 @@ dirname-lgpl
 fcntl-h
 func
 getaddrinfo
+getcwd-lgpl
 gethostname
 getpass
 gettext-h
diff --git a/tests/commandhelper.c b/tests/commandhelper.c
index 46c00f4..d60d505 100644
--- a/tests/commandhelper.c
+++ b/tests/commandhelper.c
@@ -51,6 +51,7 @@ int main(int argc, char **argv) {
     int i, n;
     char **origenv;
     char **newenv;
+    char *cwd;
     FILE *log = fopen(abs_builddir "/commandhelper.log", "w");

     if (!log)
@@ -99,13 +100,13 @@ int main(int argc, char **argv) {
     }

     fprintf(log, "DAEMON:%s\n", getpgrp() == getsid(0) ? "yes" : "no");
-    char cwd[1024];
-    if (!getcwd(cwd, sizeof(cwd)))
+    if (!(cwd = getcwd(NULL, 0)))
         return EXIT_FAILURE;
-    if (strlen(cwd) > strlen("/commanddata") &&
+    if (strlen(cwd) > strlen(".../commanddata") &&
         STREQ(cwd + strlen(cwd) - strlen("/commanddata"), "/commanddata"))
         strcpy(cwd, ".../commanddata");
     fprintf(log, "CWD:%s\n", cwd);
+    VIR_FREE(cwd);

     VIR_FORCE_FCLOSE(log);

diff --git a/tests/commandtest.c b/tests/commandtest.c
index 509c888..fa0061c 100644
--- a/tests/commandtest.c
+++ b/tests/commandtest.c
@@ -49,15 +49,11 @@ mymain(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
 static int checkoutput(const char *testname)
 {
     int ret = -1;
-    char cwd[1024];
     char *expectname = NULL;
     char *expectlog = NULL;
     char *actualname = NULL;
     char *actuallog = NULL;

-    if (!getcwd(cwd, sizeof(cwd)))
-        return -1;
-
     if (virAsprintf(&expectname, "%s/commanddata/%s.log", abs_srcdir,
                     testname) < 0)
         goto cleanup;
diff --git a/tests/testutils.c b/tests/testutils.c
index 456a735..91035a2 100644
--- a/tests/testutils.c
+++ b/tests/testutils.c
@@ -478,7 +478,6 @@ int virtTestMain(int argc,
                  int (*func)(void))
 {
     int ret;
-    char cwd[PATH_MAX];
 #if TEST_OOM
     int approxAlloc = 0;
     int n;
@@ -491,7 +490,7 @@ int virtTestMain(int argc,

     abs_srcdir = getenv("abs_srcdir");
     if (!abs_srcdir)
-        abs_srcdir = getcwd(cwd, sizeof(cwd));
+        abs_srcdir = getcwd(NULL, 0);
     if (!abs_srcdir)
         exit(EXIT_AM_HARDFAIL);

diff --git a/tools/virsh.c b/tools/virsh.c
index 0212b99..506572b 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -9893,7 +9893,6 @@ editReadBackFile (vshControl *ctl, const char *filename)
 }


-#ifndef WIN32
 /*
  * "cd" command
  */
@@ -9936,9 +9935,6 @@ cmdCd(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
     return ret;
 }

-#endif
-
-#ifndef WIN32
 /*
  * "pwd" command
  */
@@ -9952,30 +9948,20 @@ static bool
 cmdPwd(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
 {
     char *cwd;
-    size_t path_max;
-    bool err = true;
-
-    path_max = (size_t) PATH_MAX + 2;
-    cwd = vshMalloc (ctl, path_max);
-    while (cwd) {
-        err = getcwd (cwd, path_max) == NULL;
-        if (!err || errno != ERANGE)
-            break;
-
-        path_max *= 2;
-        cwd = vshRealloc (ctl, cwd, path_max);
-    }
+    bool ret = true;

-    if (err)
+    cwd = getcwd(NULL, 0);
+    if (!cwd) {
         vshError(ctl, _("pwd: cannot get current directory: %s"),
                  strerror(errno));
-    else
+        ret = false;
+    } else {
         vshPrint (ctl, _("%s\n"), cwd);
+        VIR_FREE(cwd);
+    }

-    VIR_FREE(cwd);
-    return !err;
+    return ret;
 }
-#endif

 /*
  * "echo" command
@@ -10862,15 +10848,11 @@ static const vshCmdDef secretCmds[] = {
 };

 static const vshCmdDef virshCmds[] = {
-#ifndef WIN32
     {"cd", cmdCd, opts_cd, info_cd},
-#endif
     {"echo", cmdEcho, opts_echo, info_echo},
     {"exit", cmdQuit, NULL, info_quit},
     {"help", cmdHelp, opts_help, info_help},
-#ifndef WIN32
     {"pwd", cmdPwd, NULL, info_pwd},
-#endif
     {"quit", cmdQuit, NULL, info_quit},
     {NULL, NULL, NULL, NULL}
 };
-- 
1.7.4.4




More information about the libvir-list mailing list