/* Copyright (C) 2011 ABRT Team Copyright (C) 2011 RedHat inc. 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; either version 2 of the License, or (at your option) any later version. 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "internal_libreport.h" GList *get_file_list(const char *path, const char *ext_filter) { /* Load .$ext files */ DIR *dir; dir = opendir(path); if (!dir) return NULL; GList *files = NULL; struct dirent *dent; while ((dent = readdir(dir)) != NULL) { /* skip . and .. */ if (strcmp(dent->d_name, ".") == 0 || strcmp(dent->d_name, "..") == 0) continue; char *fullname = concat_path_file(path, dent->d_name); char *ext = NULL; if (ext_filter) { ext = strrchr(dent->d_name, '.'); if (!ext) continue; if (ext_filter && strcmp(ext + 1, ext_filter) != 0) continue; *ext = '\0'; } //TODO: get rid of special handling of symlinks? struct stat buf; if (0 != lstat(fullname, &buf)) goto next; if (S_ISLNK(buf.st_mode)) { GError *error = NULL; gchar *link = g_file_read_link(fullname, &error); if (error != NULL) { error_msg("Error reading symlink '%s': %s", fullname, error->message); goto next; } gchar *target = g_path_get_basename(link); log_debug("Symlink '%s' is pointing to '%s'", link, target); if (ext_filter) { char *ext = strrchr(target, '.'); if (!ext || 0 != strcmp(ext + 1, ext_filter)) { error_msg("Invalid event symlink '%s': expected it to" " point to another '%s' file", fullname, ext_filter); goto next; } *ext = '\0'; } free(fullname); fullname = concat_path_file(path, target); files = g_list_prepend(files, new_file_obj(fullname, target)); g_free(link); g_free(target); goto next; } file_obj_t *file = new_file_obj(fullname, dent->d_name); files = g_list_prepend(files, file); next: free(fullname); } closedir(dir); return files; } void free_file_list(GList *filelist) { g_list_free_full(filelist, (GDestroyNotify)free_file_obj); }