From: <bni...@us...> - 2009-07-31 23:04:08
|
Revision: 2011 http://ganglia.svn.sourceforge.net/ganglia/?rev=2011&view=rev Author: bnicholes Date: 2009-07-31 23:03:53 +0000 (Fri, 31 Jul 2009) Log Message: ----------- revert r1927. Using cfg_parse_buf to parse the include files changes the current buffer that libconfuse is currently parsing. Once the included conf file has been parsed, there is nothing that tells libconfuse to return to the previous buffer and continue parsing. Using cfg_include solves this problem because it keeps an internal stack of partially parsed buffers so that when an included conf file is parsed, libconfuse knows to return to the previous buffer and continue parsing. Modified Paths: -------------- trunk/monitor-core/lib/libgmond.c Modified: trunk/monitor-core/lib/libgmond.c =================================================================== --- trunk/monitor-core/lib/libgmond.c 2009-07-30 16:04:34 UTC (rev 2010) +++ trunk/monitor-core/lib/libgmond.c 2009-07-31 23:03:53 UTC (rev 2011) @@ -709,8 +709,6 @@ struct stat statbuf; DIR *dir; struct dirent *entry; - char *buff; - int fd; if(argc != 1) { @@ -720,15 +718,7 @@ if (stat (fname, &statbuf) == 0) { - buff = calloc(statbuf.st_size + 1, 1); - fd = open(fname, O_RDONLY); - read(fd, buff, statbuf.st_size); - close(fd); - fd = cfg_parse_buf(cfg, buff); - free(buff); - if (fd) - cfg_error(cfg, "error including %s", fname); - return fd; + return cfg_include(cfg, opt, argc, argv); } else if (has_wildcard(fname)) { @@ -737,7 +727,9 @@ char *pattern = NULL; char *idx = strrchr(fname, '/'); apr_pool_t *p; + apr_file_t *ftemp; char *dirname = NULL; + char tn[] = "gmond.tmp.XXXXXX"; if (idx == NULL) { idx = strrchr(fname, '\\'); @@ -753,35 +745,57 @@ } apr_pool_create(&p, NULL); + if (apr_temp_dir_get((const char**)&dirname, p) != APR_SUCCESS) { +#ifndef LINUX + cfg_error(cfg, "failed to determine the temp dir"); + apr_pool_destroy(p); + return 1; +#else + /* + * workaround APR BUG46297 by using the POSIX shared memory + * ramdrive that is available since glibc 2.2 + */ + dirname = apr_psprintf(p, "%s", "/dev/shm"); +#endif + } + dirname = apr_psprintf(p, "%s/%s", dirname, tn); + + if (apr_file_mktemp(&ftemp, dirname, + APR_CREATE | APR_READ | APR_WRITE | APR_DELONCLOSE, + p) != APR_SUCCESS) { + cfg_error(cfg, "unable to create a temporary file %s", dirname); + apr_pool_destroy(p); + return 1; + } + dir = opendir(path); - if (dir != NULL) { - while ((entry = readdir(dir)) != NULL) { + if(dir != NULL){ + while((entry = readdir(dir)) != NULL) { ret = fnmatch(pattern, entry->d_name, FNM_PATHNAME|FNM_PERIOD); if (ret == 0) { - char *newpath; + char *newpath, *line; newpath = apr_psprintf (p, "%s/%s", path, entry->d_name); - - stat(newpath, &statbuf); - buff = calloc(statbuf.st_size + 1, 1); - fd = open(newpath, O_RDONLY); - read(fd, buff, statbuf.st_size); - close(fd); - fd = cfg_parse_buf(cfg, buff); - free(buff); - if (fd) { - cfg_error(cfg, "error including %s", newpath); - return fd; - } + line = apr_pstrcat(p, "include ('", newpath, "')\n", NULL); + apr_file_puts(line, ftemp); } } closedir(dir); free (path); + + argv[0] = dirname; + if (cfg_include(cfg, opt, argc, argv)) + cfg_error(cfg, "failed to process include file %s", fname); + else + debug_msg("processed include file %s\n", fname); } + apr_file_close(ftemp); apr_pool_destroy(p); + + argv[0] = fname; } else { @@ -791,3 +805,4 @@ return 0; } + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |