diff options
Diffstat (limited to 'src/core/depscan.c')
-rw-r--r-- | src/core/depscan.c | 297 |
1 files changed, 0 insertions, 297 deletions
diff --git a/src/core/depscan.c b/src/core/depscan.c index 5030eb4..e69de29 100644 --- a/src/core/depscan.c +++ b/src/core/depscan.c @@ -1,297 +0,0 @@ -/* - * depscan.c - * - * Basic frontend for updating the dependency cache. - * - * Copyright (C) 2004,2005 Martin Schlemmer <azarah@nosferatu.za.org> - * - * - * 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 the - * Free Software Foundation version 2 of the License. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 675 Mass Ave, Cambridge, MA 02139, USA. - * - * $Header$ - */ - -#include <errno.h> -#ifndef __KLIBC__ -# include <locale.h> -#endif -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <unistd.h> - -#include "debug.h" -#include "depend.h" -#include "misc.h" -#include "parse.h" - -char* svcdir_subdirs[] = { - "softscripts", - "snapshot", - "options", - "started", - "starting", - "inactive", - "stopping", - NULL -}; - -char *svcdir_volatile_subdirs[] = { - "snapshot", - "broken", - NULL -}; - -int create_directory(const char *name); -int create_var_dirs(const char *svcdir); -int delete_var_dirs(const char *svcdir); - -int create_directory(const char *name) { - if ((NULL == name) || (0 == strlen(name))) { - DBG_MSG("Invalid argument passed!\n"); - errno = EINVAL; - return -1; - } - - /* Check if directory exist, and is not a symlink */ - if (!is_dir(name, 0)) { - if (exists(name)) { - /* Remove it if not a directory */ - if (-1 == unlink(name)) { - DBG_MSG("Failed to remove '%s'!\n", name); - return -1; - } - } - /* Now try to create the directory */ - if (-1 == mktree(name, 0755)) { - DBG_MSG("Failed to create '%s'!\n", name); - return -1; - } - } - - return 0; -} - -int create_var_dirs(const char *svcdir) { - char *tmp_path = NULL; - int i = 0; - - if ((NULL == svcdir) || (0 == strlen(svcdir))) { - DBG_MSG("Invalid argument passed!\n"); - errno = EINVAL; - return -1; - } - - /* Check and create svcdir if needed */ - if (-1 == create_directory(svcdir)) { - DBG_MSG("Failed to create '%s'!\n", svcdir); - return -1; - } - - while (NULL != svcdir_subdirs[i]) { - tmp_path = strcatpaths(svcdir, svcdir_subdirs[i]); - if (NULL == tmp_path) { - DBG_MSG("Failed to allocate buffer!\n"); - return -1; - } - - /* Check and create all the subdirs if needed */ - if (-1 == create_directory(tmp_path)) { - DBG_MSG("Failed to create '%s'!\n", tmp_path); - free(tmp_path); - return -1; - } - - free(tmp_path); - i++; - } - - return 0; -} - -int delete_var_dirs(const char *svcdir) { - char *tmp_path = NULL; - int i = 0; - - if ((NULL == svcdir) || (0 == strlen(svcdir))) { - DBG_MSG("Invalid argument passed!\n"); - errno = EINVAL; - return -1; - } - - /* Just quit if svcdir do not exist */ - if (!exists(svcdir)) { - DBG_MSG("'%s' does not exist!\n", svcdir); - return 0; - } - - while (NULL != svcdir_volatile_subdirs[i]) { - tmp_path = strcatpaths(svcdir, svcdir_volatile_subdirs[i]); - if (NULL == tmp_path) { - DBG_MSG("Failed to allocate buffer!\n"); - return -1; - } - - /* Skip the directory if it does not exist */ - if (!exists(tmp_path)) - goto _continue; - - /* Check and delete all files and sub directories if needed */ - if (-1 == rmtree(tmp_path)) { - DBG_MSG("Failed to delete '%s'!\n", tmp_path); - free(tmp_path); - return -1; - } - -_continue: - free(tmp_path); - i++; - } - - return 0; -} - -#if defined(LEGACY_DEPSCAN) - -int main() { - FILE *cachefile_fd = NULL; - char *data = NULL; - char *svcdir = NULL; - char *cachefile = NULL; - char *tmp_cachefile = NULL; - int tmp_cachefile_fd = 0; - int datasize = 0; - - /* Make sure we do not run into locale issues */ -#ifndef __KLIBC__ - setlocale (LC_ALL, "C"); -#endif - - if (0 != getuid()) { - EERROR("Must be root!\n"); - exit(EXIT_FAILURE); - } - - svcdir = get_cnf_entry(RC_CONFD_FILE_NAME, SVCDIR_CONFIG_ENTRY); - if (NULL == svcdir) { - EERROR("Failed to get config entry '%s'!\n", - SVCDIR_CONFIG_ENTRY); - exit(EXIT_FAILURE); - } - - /* Delete (if needed) volatile directories in svcdir */ - if (-1 == delete_var_dirs(svcdir)) { - /* XXX: Not 100% accurate below message ... */ - EERROR("Failed to delete '%s', %s", svcdir, - "or one of its sub directories!\n"); - exit(EXIT_FAILURE); - } - - /* Create all needed directories in svcdir */ - if (-1 == create_var_dirs(svcdir)) { - EERROR("Failed to create '%s', %s", svcdir, - "or one of its sub directories!\n"); - exit(EXIT_FAILURE); - } - - cachefile = strcatpaths(svcdir, LEGACY_CACHE_FILE_NAME); - if (NULL == cachefile) { - DBG_MSG("Failed to allocate buffer!\n"); - exit(EXIT_FAILURE); - } - - tmp_cachefile = strcatpaths(cachefile, "XXXXXX"); - if (NULL == tmp_cachefile) { - DBG_MSG("Failed to allocate buffer!\n"); - exit(EXIT_FAILURE); - } - /* Replace the "/XXXXXX" with ".XXXXXX" - * Yes, I am lazy. */ - tmp_cachefile[strlen(tmp_cachefile) - strlen(".XXXXXX")] = '.'; - - if (-1 == get_rcscripts()) { - EERROR("Failed to get rc-scripts list!\n"); - exit(EXIT_FAILURE); - } - - if (-1 == check_rcscripts_mtime(cachefile)) { - EINFO("Caching service dependencies ...\n"); - DBG_MSG("Regenerating cache file '%s'.\n", cachefile); - - datasize = generate_stage2(&data); - if (-1 == datasize) { - EERROR("Failed to generate stage2!\n"); - exit(EXIT_FAILURE); - } - - if (-1 == parse_cache(data, datasize)) { - EERROR("Failed to parse stage2 output!\n"); - free(data); - exit(EXIT_FAILURE); - } - -#if 0 - tmp_cachefile_fd = open("foo", O_CREAT | O_TRUNC | O_RDWR, 0600); - write(tmp_cachefile_fd, data, datasize); - close(tmp_cachefile_fd); -#endif - - free(data); - - if (-1 == service_resolve_dependencies()) { - EERROR("Failed to resolve dependencies!\n"); - exit(EXIT_FAILURE); - } - -#ifndef __KLIBC__ - tmp_cachefile_fd = mkstemp(tmp_cachefile); -#else - /* FIXME: Need to add a mkstemp implementation for klibc */ - tmp_cachefile_fd = open(tmp_cachefile, O_CREAT | O_TRUNC | O_RDWR, 0600); -#endif - if (-1 == tmp_cachefile_fd) { - EERROR("Could not open temporary file for writing!\n"); - exit(EXIT_FAILURE); - } - cachefile_fd = fdopen(tmp_cachefile_fd, "w"); - if (NULL == cachefile_fd) { - EERROR("Could not open temporary file for writing!\n"); - exit(EXIT_FAILURE); - } - - write_legacy_stage3(cachefile_fd); - fclose(cachefile_fd); - - if ((-1 == unlink(cachefile)) && (exists(cachefile))) { - EERROR("Could not remove '%s'!\n", cachefile); - unlink(tmp_cachefile); - exit(EXIT_FAILURE); - } - - if (-1 == rename(tmp_cachefile, cachefile)) { - EERROR("Could not move temporary file to '%s'!\n", - cachefile); - unlink(tmp_cachefile); - exit(EXIT_FAILURE); - } - } - - exit(EXIT_SUCCESS); -} - -#endif - |