1 /* Advance in archive to next element. 2 Copyright (C) 1998, 1999, 2000, 2002 Red Hat, Inc. 3 Contributed by Ulrich Drepper <drepper (at) redhat.com>, 1998. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation, version 2. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software Foundation, 16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ 17 18 #ifdef HAVE_CONFIG_H 19 # include <config.h> 20 #endif 21 22 #include <assert.h> 23 #include <libelf.h> 24 #include <stddef.h> 25 26 #include "libelfP.h" 27 28 29 Elf_Cmd 30 elf_next (elf) 31 Elf *elf; 32 { 33 Elf *parent; 34 35 /* Be gratious, the specs demand it. */ 36 if (elf == NULL || elf->parent == NULL) 37 return ELF_C_NULL; 38 39 /* We can be sure the parent is an archive. */ 40 parent = elf->parent; 41 assert (parent->kind == ELF_K_AR); 42 43 /* Now advance the offset. */ 44 parent->state.ar.offset += (sizeof (struct ar_hdr) 45 + ((parent->state.ar.elf_ar_hdr.ar_size + 1) 46 & ~1l)); 47 48 /* Get the next archive header. */ 49 if (__libelf_next_arhdr (parent) != 0) 50 return ELF_C_NULL; 51 52 return elf->cmd; 53 } 54