Branch data Line data Source code
1 : : /* 2 : : * libdpkg - Debian packaging suite library routines 3 : : * fsys-iter.c - filesystem nodes iterators 4 : : * 5 : : * Copyright © 1995 Ian Jackson <ijackson@chiark.greenend.org.uk> 6 : : * Copyright © 2000, 2001 Wichert Akkerman <wakkerma@debian.org> 7 : : * Copyright © 2008-2014 Guillem Jover <guillem@debian.org> 8 : : * 9 : : * This is free software; you can redistribute it and/or modify 10 : : * it under the terms of the GNU General Public License as published by 11 : : * the Free Software Foundation; either version 2 of the License, or 12 : : * (at your option) any later version. 13 : : * 14 : : * This is distributed in the hope that it will be useful, 15 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 : : * GNU General Public License for more details. 18 : : * 19 : : * You should have received a copy of the GNU General Public License 20 : : * along with this program. If not, see <https://www.gnu.org/licenses/>. 21 : : */ 22 : : 23 : : #include <config.h> 24 : : #include <compat.h> 25 : : 26 : : #include <stdlib.h> 27 : : 28 : : #include <dpkg/dpkg.h> 29 : : #include <dpkg/dpkg-db.h> 30 : : #include <dpkg/pkg-list.h> 31 : : 32 : : #include "fsys.h" 33 : : 34 : : /* 35 : : * Reverse iterator. 36 : : */ 37 : : 38 : : /* 39 : : * Initializes an iterator that appears to go through the file list ‘files’ 40 : : * in reverse order, returning the namenode from each. What actually happens 41 : : * is that we walk the list here, building up a reverse list, and then peel 42 : : * it apart one entry at a time. 43 : : */ 44 : : void 45 : 0 : fsys_hash_rev_iter_init(struct fsys_hash_rev_iter *iter, 46 : : struct fsys_namenode_list *files) 47 : : { 48 : : struct fsys_namenode_list *newent; 49 : : 50 : 0 : iter->todo = NULL; 51 [ # # ]: 0 : while (files) { 52 : 0 : newent = m_malloc(sizeof(*newent)); 53 : 0 : newent->namenode = files->namenode; 54 : 0 : newent->next = iter->todo; 55 : 0 : iter->todo = newent; 56 : 0 : files = files->next; 57 : : } 58 : 0 : } 59 : : 60 : : struct fsys_namenode * 61 : 0 : fsys_hash_rev_iter_next(struct fsys_hash_rev_iter *iter) 62 : : { 63 : : struct fsys_namenode *next; 64 : : struct fsys_namenode_list *todo; 65 : : 66 : 0 : todo = iter->todo; 67 [ # # ]: 0 : if (!todo) 68 : 0 : return NULL; 69 : 0 : next = todo->namenode; 70 : 0 : iter->todo = todo->next; 71 : 0 : free(todo); 72 : : 73 : 0 : return next; 74 : : } 75 : : 76 : : /* 77 : : * Clients must call this function to clean up the fsys_hash_rev_iter 78 : : * if they wish to break out of the iteration before it is all done. 79 : : * Calling this function is not necessary if fsys_hash_rev_iter_next() has 80 : : * been called until it returned 0. 81 : : */ 82 : : void 83 : 0 : fsys_hash_rev_iter_abort(struct fsys_hash_rev_iter *iter) 84 : : { 85 [ # # ]: 0 : while (fsys_hash_rev_iter_next(iter)) 86 : : ; 87 : 0 : } 88 : : 89 : : /* 90 : : * Iterator for packages owning a file. 91 : : */ 92 : : 93 : : struct fsys_node_pkgs_iter { 94 : : struct pkg_list *pkg_node; 95 : : }; 96 : : 97 : : struct fsys_node_pkgs_iter * 98 : 7 : fsys_node_pkgs_iter_new(struct fsys_namenode *fnn) 99 : : { 100 : : struct fsys_node_pkgs_iter *iter; 101 : : 102 : 7 : iter = m_malloc(sizeof(*iter)); 103 : 7 : iter->pkg_node = fnn->packages; 104 : : 105 : 7 : return iter; 106 : : } 107 : : 108 : : struct pkginfo * 109 : 7 : fsys_node_pkgs_iter_next(struct fsys_node_pkgs_iter *iter) 110 : : { 111 : : struct pkg_list *pkg_node; 112 : : 113 [ + + ]: 7 : if (iter->pkg_node == NULL) 114 : 6 : return NULL; 115 : : 116 : 1 : pkg_node = iter->pkg_node; 117 : 1 : iter->pkg_node = pkg_node->next; 118 : : 119 : 1 : return pkg_node->pkg; 120 : : } 121 : : 122 : : void 123 : 7 : fsys_node_pkgs_iter_free(struct fsys_node_pkgs_iter *iter) 124 : : { 125 : 7 : free(iter); 126 : 7 : }