FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Ubuntu > Kubuntu Development

 
 
LinkBack Thread Tools
 
Old 11-02-2010, 07:44 PM
David Cantrell
 
Default Remove mkdirChain() from isys, use g_mkdir_with_parents()

Replace uses of mkdirChain() with g_mkdir_with_parents() and
remove the existing mkdirChain() code from isys/imount.*
---
loader/driverdisk.c | 15 +++++++++---
loader/loader.c | 6 +++-
loader/method.c | 6 +++-
pyanaconda/isys/imount.c | 52 +--------------------------------------------
pyanaconda/isys/imount.h | 1 -
5 files changed, 21 insertions(+), 59 deletions(-)

diff --git a/loader/driverdisk.c b/loader/driverdisk.c
index 2688c82..9b4c710 100644
--- a/loader/driverdisk.c
+++ b/loader/driverdisk.c
@@ -265,9 +265,15 @@ static int loadDriverDisk(struct loaderData_s *loaderData, char *mntpt) {
logMessage(DEBUGLVL, "Kernel version: %s", kernelver);

sprintf(file, DD_RPMDIR_TEMPLATE, disknum);
- mkdirChain(file);
- mkdirChain(DD_MODULES);
- mkdirChain(DD_FIRMWARE);
+
+ if (g_mkdir_with_parents(file, 0755) == -1)
+ logMessage(ERROR, "mkdir error on %s: %m", file);
+
+ if (g_mkdir_with_parents(DD_MODULES, 0755) == -1)
+ logMessage(ERROR, "mkdir error on %s: %m", DD_MODULES);
+
+ if (g_mkdir_with_parents(DD_FIRMWARE, 0755) == -1)
+ logMessage(ERROR, "mkdir error on %s: %m", DD_FIRMWARE);

if (!FL_CMDLINE(flags)) {
startNewt();
@@ -293,7 +299,8 @@ static int loadDriverDisk(struct loaderData_s *loaderData, char *mntpt) {

/* ensure updates directory exists */
sprintf(file, "/lib/modules/%s/updates", kernelver);
- mkdirChain(file);
+ if (g_mkdir_with_parents(file, 0755) == -1)
+ logMessage(ERROR, "mkdir error on %s: %m", file);

/* make sure driver update are referenced from system module dir
but from a different subdir, initrd overlays use the main
diff --git a/loader/loader.c b/loader/loader.c
index 88d7a7a..50daeb0 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -2146,8 +2146,10 @@ int main(int argc, char ** argv) {

/* make sure /tmp/updates exists so that magic in anaconda to */
/* symlink rhpl/ will work */
- if (access("/tmp/updates", F_OK))
- mkdirChain("/tmp/updates");
+ if (access("/tmp/updates", F_OK)) {
+ if (g_mkdir_with_parents("/tmp/updates", 0755) == -1)
+ logMessage(ERROR, "mkdir error on /tmp/updates: %m");
+ }

add_fw_search_dir(&loaderData, "/tmp/updates/firmware");
add_fw_search_dir(&loaderData, "/tmp/product/firmware");
diff --git a/loader/method.c b/loader/method.c
index 844048f..d84a2e8 100644
--- a/loader/method.c
+++ b/loader/method.c
@@ -313,8 +313,10 @@ int unpackCpioBall(char * ballPath, char * rootDir) {
if (access(ballPath, R_OK))
return 1;

- if (access(rootDir, R_OK))
- mkdirChain(rootDir);
+ if (access(rootDir, R_OK)) {
+ if (g_mkdir_with_parents(rootDir, 0755) == -1)
+ logMessage(ERROR, "mkdir error on %s: %m", rootDir);
+ }

buf = (char *)malloc(PATH_MAX);
cwd = getcwd(buf, PATH_MAX);
diff --git a/pyanaconda/isys/imount.c b/pyanaconda/isys/imount.c
index ed0f5a7..39265a0 100644
--- a/pyanaconda/isys/imount.c
+++ b/pyanaconda/isys/imount.c
@@ -27,14 +27,13 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
+#include <glib.h>

#include "imount.h"
#include "log.h"

#define _(foo) foo

-static int mkdirIfNone(char * directory);
-
static int readFD(int fd, char **buf) {
char *p;
size_t size = 4096;
@@ -88,7 +87,7 @@ int mountCommandWrapper(int mode, char *dev, char *where, char *fs,
case IMOUNT_MODE_MOUNT:
case IMOUNT_MODE_BIND:
cmd = "/bin/mount";
- if (mkdirChain(where))
+ if (g_mkdir_with_parents(where, 0755))
return IMOUNT_ERR_ERRNO;
break;
case IMOUNT_MODE_UMOUNT:
@@ -264,31 +263,6 @@ int doPwUmount(char *where, char **err) {
NULL, where, NULL, NULL, err);
}

-int mkdirChain(char * origChain) {
- char * chain;
- char * chptr;
-
- chain = alloca(strlen(origChain) + 1);
- strcpy(chain, origChain);
- chptr = chain;
-
- while ((chptr = strchr(chptr, '/'))) {
- *chptr = '';
- if (mkdirIfNone(chain)) {
- *chptr = '/';
- return IMOUNT_ERR_ERRNO;
- }
-
- *chptr = '/';
- chptr++;
- }
-
- if (mkdirIfNone(chain))
- return IMOUNT_ERR_ERRNO;
-
- return 0;
-}
-
/* Returns true iff it is possible that the mount command that have returned
* 'errno' might succeed at a later time (think e.g. not yet initialized USB
* device, etc.) */
@@ -304,25 +278,3 @@ int mountMightSucceedLater(int mountRc)
}
return rc;
}
-
-static int mkdirIfNone(char * directory) {
- int rc, mkerr;
- char * chptr;
-
- /* If the file exists it *better* be a directory -- I'm not going to
- actually check or anything */
- if (!access(directory, X_OK)) return 0;
-
- /* if the path is '/' we get ENOFILE not found" from mkdir, rather
- then EEXIST which is weird */
- for (chptr = directory; *chptr; chptr++)
- if (*chptr != '/') break;
- if (!*chptr) return 0;
-
- rc = mkdir(directory, 0755);
- mkerr = errno;
-
- if (!rc || mkerr == EEXIST) return 0;
-
- return IMOUNT_ERR_ERRNO;
-}
diff --git a/pyanaconda/isys/imount.h b/pyanaconda/isys/imount.h
index d1b7cf3..3ce6387 100644
--- a/pyanaconda/isys/imount.h
+++ b/pyanaconda/isys/imount.h
@@ -44,7 +44,6 @@
int doBindMount(char* path, char *where, char **err);
int doPwMount(char *dev, char *where, char *fs, char *options, char **err);
int doPwUmount(char *where, char **err);
-int mkdirChain(char * origChain);
int mountMightSucceedLater(int mountRc);

#endif
--
1.7.2.3

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 
Old 11-09-2010, 09:45 PM
David Cantrell
 
Default Remove mkdirChain() from isys, use g_mkdir_with_parents()

Replace uses of mkdirChain() with g_mkdir_with_parents() and
remove the existing mkdirChain() code from isys/imount.*

Added a wrapper function for g_mkdir_with_parents() usage.
---
loader/driverdisk.c | 12 +++++++---
loader/loader.c | 14 ++++++------
loader/unpack.c | 26 +++++++++++++++++-----
loader/unpack.h | 1 +
pyanaconda/isys/imount.c | 52 +--------------------------------------------
pyanaconda/isys/imount.h | 1 -
6 files changed, 38 insertions(+), 68 deletions(-)

diff --git a/loader/driverdisk.c b/loader/driverdisk.c
index 91dbd51..28fe612 100644
--- a/loader/driverdisk.c
+++ b/loader/driverdisk.c
@@ -54,6 +54,7 @@
#include "urlinstall.h"

#include "rpmextract.h"
+#include "unpack.h"

#include "../pyanaconda/isys/isys.h"
#include "../pyanaconda/isys/imount.h"
@@ -243,9 +244,11 @@ static int loadDriverDisk(struct loaderData_s *loaderData, char *mntpt) {
logMessage(DEBUGLVL, "Kernel version: %s", kernelver);

sprintf(file, DD_RPMDIR_TEMPLATE, disknum);
- mkdirChain(file);
- mkdirChain(DD_MODULES);
- mkdirChain(DD_FIRMWARE);
+
+ if (unpack_mkpath(file) != ARCHIVE_OK ||
+ unpack_mkpath(DD_MODULES) != ARCHIVE_OK ||
+ unpack_mkpath(DD_FIRMWARE) != ARCHIVE_OK)
+ goto loadDriverDiscException;

if (!FL_CMDLINE(flags)) {
startNewt();
@@ -271,7 +274,8 @@ static int loadDriverDisk(struct loaderData_s *loaderData, char *mntpt) {

/* ensure updates directory exists */
sprintf(file, "/lib/modules/%s/updates", kernelver);
- mkdirChain(file);
+ if (unpack_mkpath(file) != ARCHIVE_OK)
+ goto loadDriverDiscException;

/* make sure driver update are referenced from system module dir
but from a different subdir, initrd overlays use the main
diff --git a/loader/loader.c b/loader/loader.c
index 88d7a7a..05cb784 100644
--- a/loader/loader.c
+++ b/loader/loader.c
@@ -90,6 +90,7 @@
#include "ibft.h"
#include "net.h"
#include "readvars.h"
+#include "unpack.h"

#include <selinux/selinux.h>
#include "selinux.h"
@@ -2146,17 +2147,16 @@ int main(int argc, char ** argv) {

/* make sure /tmp/updates exists so that magic in anaconda to */
/* symlink rhpl/ will work */
- if (access("/tmp/updates", F_OK))
- mkdirChain("/tmp/updates");
+ if (unpack_mkpath("/tmp/updates") == ARCHIVE_OK) {
+ add_fw_search_dir(&loaderData, "/tmp/updates/firmware");
+ add_to_path_env("PYTHONPATH", "/tmp/updates");
+ add_to_path_env("LD_LIBRARY_PATH", "/tmp/updates");
+ add_to_path_env("PATH", "/tmp/updates");
+ }

- add_fw_search_dir(&loaderData, "/tmp/updates/firmware");
add_fw_search_dir(&loaderData, "/tmp/product/firmware");
-
- add_to_path_env("PYTHONPATH", "/tmp/updates");
add_to_path_env("PYTHONPATH", "/tmp/product");
- add_to_path_env("LD_LIBRARY_PATH", "/tmp/updates");
add_to_path_env("LD_LIBRARY_PATH", "/tmp/product");
- add_to_path_env("PATH", "/tmp/updates");
add_to_path_env("PATH", "/tmp/product");

stop_fw_loader(&loaderData);
diff --git a/loader/unpack.c b/loader/unpack.c
index f3fa205..c7b47e8 100644
--- a/loader/unpack.c
+++ b/loader/unpack.c
@@ -29,6 +29,24 @@
#include "../pyanaconda/isys/log.h"

/*
+ * Wrapper for g_mkdir_with_parents()
+ */
+int unpack_mkpath(char *path) {
+ if (path == NULL)
+ return ARCHIVE_FATAL;
+
+ if (access(path, R_OK|W_OK|X_OK)) {
+ if (g_mkdir_with_parents(path, 0755) == -1) {
+ logMessage(ERROR, "unable to mkdir %s (%s:%d): %m",
+ path, __func__, __LINE__);
+ return ARCHIVE_FATAL;
+ }
+ }
+
+ return ARCHIVE_OK;
+}
+
+/*
* Initialize libarchive object for unpacking an archive file.
* Args:
* struct archive **a The archive object to use.
@@ -69,12 +87,8 @@ int unpack_members_and_finish(struct archive *a, char *dest) {
}

if (dest != NULL) {
- if (access(dest, R_OK|W_OK|X_OK)) {
- if (g_mkdir_with_parents(dest, 0755) == -1) {
- logMessage(ERROR, "unable to mkdir %s (%s:%d): %m",
- dest, __func__, __LINE__);
- return ARCHIVE_FATAL;
- }
+ if (unpack_mkpath(dest) != ARCHIVE_OK) {
+ return ARCHIVE_FATAL;
} else if (chdir(dest) == -1) {
logMessage(ERROR, "unable to chdir %s (%s:%d): %m",
dest, __func__, __LINE__);
diff --git a/loader/unpack.h b/loader/unpack.h
index 0ce1fac..ebc67bb 100644
--- a/loader/unpack.h
+++ b/loader/unpack.h
@@ -24,6 +24,7 @@

#include <archive.h>

+int unpack_mkpath(char *);
int unpack_init(struct archive **);
int unpack_members_and_finish(struct archive *, char *);
int unpack_archive_file(char *, char *);
diff --git a/pyanaconda/isys/imount.c b/pyanaconda/isys/imount.c
index ed0f5a7..39265a0 100644
--- a/pyanaconda/isys/imount.c
+++ b/pyanaconda/isys/imount.c
@@ -27,14 +27,13 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
+#include <glib.h>

#include "imount.h"
#include "log.h"

#define _(foo) foo

-static int mkdirIfNone(char * directory);
-
static int readFD(int fd, char **buf) {
char *p;
size_t size = 4096;
@@ -88,7 +87,7 @@ int mountCommandWrapper(int mode, char *dev, char *where, char *fs,
case IMOUNT_MODE_MOUNT:
case IMOUNT_MODE_BIND:
cmd = "/bin/mount";
- if (mkdirChain(where))
+ if (g_mkdir_with_parents(where, 0755))
return IMOUNT_ERR_ERRNO;
break;
case IMOUNT_MODE_UMOUNT:
@@ -264,31 +263,6 @@ int doPwUmount(char *where, char **err) {
NULL, where, NULL, NULL, err);
}

-int mkdirChain(char * origChain) {
- char * chain;
- char * chptr;
-
- chain = alloca(strlen(origChain) + 1);
- strcpy(chain, origChain);
- chptr = chain;
-
- while ((chptr = strchr(chptr, '/'))) {
- *chptr = '';
- if (mkdirIfNone(chain)) {
- *chptr = '/';
- return IMOUNT_ERR_ERRNO;
- }
-
- *chptr = '/';
- chptr++;
- }
-
- if (mkdirIfNone(chain))
- return IMOUNT_ERR_ERRNO;
-
- return 0;
-}
-
/* Returns true iff it is possible that the mount command that have returned
* 'errno' might succeed at a later time (think e.g. not yet initialized USB
* device, etc.) */
@@ -304,25 +278,3 @@ int mountMightSucceedLater(int mountRc)
}
return rc;
}
-
-static int mkdirIfNone(char * directory) {
- int rc, mkerr;
- char * chptr;
-
- /* If the file exists it *better* be a directory -- I'm not going to
- actually check or anything */
- if (!access(directory, X_OK)) return 0;
-
- /* if the path is '/' we get ENOFILE not found" from mkdir, rather
- then EEXIST which is weird */
- for (chptr = directory; *chptr; chptr++)
- if (*chptr != '/') break;
- if (!*chptr) return 0;
-
- rc = mkdir(directory, 0755);
- mkerr = errno;
-
- if (!rc || mkerr == EEXIST) return 0;
-
- return IMOUNT_ERR_ERRNO;
-}
diff --git a/pyanaconda/isys/imount.h b/pyanaconda/isys/imount.h
index d1b7cf3..3ce6387 100644
--- a/pyanaconda/isys/imount.h
+++ b/pyanaconda/isys/imount.h
@@ -44,7 +44,6 @@
int doBindMount(char* path, char *where, char **err);
int doPwMount(char *dev, char *where, char *fs, char *options, char **err);
int doPwUmount(char *where, char **err);
-int mkdirChain(char * origChain);
int mountMightSucceedLater(int mountRc);

#endif
--
1.7.3.2

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@redhat.com
https://www.redhat.com/mailman/listinfo/anaconda-devel-list
 

Thread Tools




All times are GMT. The time now is 01:18 PM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org