diff -r 5549419824b4 -r e63951c1d0f8 librazor/util.c --- a/librazor/util.c Wed Jul 08 22:14:16 2009 +0100 +++ b/librazor/util.c Thu Nov 10 10:35:21 2011 +0000 @@ -1,7 +1,7 @@ /* * Copyright (C) 2008 Kristian Høgsberg * Copyright (C) 2008 Red Hat, Inc - * Copyright (C) 2009 J. Ali Harlow + * Copyright (C) 2009, 2011 J. Ali Harlow * * 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 @@ -33,6 +33,8 @@ #ifdef MSWIN_API #include #include +#else +#include #endif #if HAVE_SYS_MMAN_H #include @@ -46,137 +48,9 @@ #define O_BINARY 0 #endif -#define RAZOR_ASCII_ISALPHA(c) \ - ((c) >= 'A' && (c) <= 'Z' || (c) >= 'a' && (c) <= 'z') - /* Required by gnulib on non-libc platforms */ char *program_name = "librazor"; -static int allow_all_root_names = 0; - -/* - * Primarily intended for testing named roots under UNIX platforms. - */ -RAZOR_EXPORT void razor_disable_root_name_checks(int disable) -{ - allow_all_root_names = disable; -} - -static int razor_valid_root_name(const char *name) -{ - if (allow_all_root_names) - return !strchr(name,'/'); - -#ifdef MSWIN_API - return RAZOR_ASCII_ISALPHA(name[0]) && name[1] == ':' && - name[2] == '\0'; -#else - return name[0] == '\0'; -#endif -} - -int -razor_create_dir(const char *root, const char *path) -{ - char buffer[PATH_MAX], *p; - const char *slash, *next; - struct stat buf; - - /* Create all sub-directories in dir. We know root exists and - * is a dir, root does not end in a '/', and path either has a - * leading '/' or (on MS-Windows only) root is the empty string - * and path starts with drive (eg., "c:/windows"). */ - - strcpy(buffer, root); - p = buffer + strlen(buffer); - slash = path; - for (slash = path; *slash != '\0'; slash = next) { - next = strchr(slash + 1, '/'); - if (next == NULL) - break; - - memcpy(p, slash, next - slash); - p += next - slash; - *p = '\0'; - - if (razor_valid_root_name(buffer)) - continue; - - if (stat(buffer, &buf) == 0) { - if (!S_ISDIR(buf.st_mode)) { - fprintf(stderr, - "%s exists but is not a directory\n", - buffer); - return -1; - } - } else if (mkdir(buffer, 0777) < 0) { - fprintf(stderr, "failed to make directory %s: %s\n", - buffer, strerror(errno)); - return -1; - } - - /* FIXME: What to do about permissions for dirs we - * have to create but are not in the cpio archive? */ - } - - return 0; -} - -int -razor_remove(const char *path) -{ -#ifdef MSWIN_API - DWORD err; - - if (DeleteFile(path)) - return 0; - - err = GetLastError(); - if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND) - return 0; - - if (SetFileAttributes(path, FILE_ATTRIBUTE_NORMAL) && DeleteFile(path)) - return 0; - - if (RemoveDirectory(path) || GetLastError() == ERROR_DIR_NOT_EMPTY) - return 0; - - /* - * It would be tempting to use: - * MoveFileEx(path, NULL, MOVEFILE_DELAY_UNTIL_REBOOT) - * but unless we can guarantee that the system will be rebooted - * before we (or some other application) write another file with the - * same path, this is likely to cause more problems than it solves. - */ - - /* Use remove() as a fallback so that errno is set appropriately */ -#endif - - return remove(path); -} - -int -razor_write(int fd, const void *data, size_t size) -{ - size_t rest; - ssize_t written; - const unsigned char *p; - - rest = size; - p = data; - while (rest > 0) { - written = write(fd, p, rest); - if (written < 0) { - perror("write error"); - return -1; - } - rest -= written; - p += written; - } - - return 0; -} - void * razor_file_get_contents(const char *filename, size_t *length) { @@ -225,7 +99,6 @@ return addr; } -int razor_file_free_contents(void *addr, size_t length) { #if HAVE_SYS_MMAN_H @@ -396,3 +269,66 @@ array_release(&env->string_pool); array_release(&env->vars); } + +RAZOR_EXPORT char *razor_concat(const char *s, ...) +{ + va_list args; + const char *string; + char *concat; + size_t n, len; + + va_start(args, s); + + len = strlen(s); + while((string = va_arg(args, const char *))) + len += strlen(string); + + va_end(args); + + concat = malloc(len + 1); + + if (!concat) + return NULL; + + va_start(args, s); + + len = strlen(s); + memcpy(concat, s, len); + n = len; + while((string = va_arg(args, const char *))) { + len = strlen(string); + memcpy(concat + n, string, len); + n += len; + } + + va_end(args); + + concat[n] = '\0'; + + return concat; +} + +RAZOR_EXPORT const char *razor_system_arch(void) +{ +#ifdef MSWIN_API + SYSTEM_INFO si; + + GetNativeSystemInfo(&si); + switch(si.wProcessorArchitecture) + { + case PROCESSOR_ARCHITECTURE_INTEL: + return "i686"; + case PROCESSOR_ARCHITECTURE_AMD64: + return "x86_64"; + default: + return NULL; + } +#else + static struct utsname un; + + if (uname(&un)) + return NULL; + else + return un.machine; +#endif +}