Mostly tasteful/consistent splint annotations for libelf.
[platform/upstream/rpm.git] / elfutils / libelf / elf_cntl.c
1 /* Control an ELF file desrciptor.
2    Copyright (C) 1998, 1999, 2000, 2002 Red Hat, Inc.
3    Written by Ulrich Drepper <drepper@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 version 2 as
7    published by the Free Software Foundation.
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 <unistd.h>
23
24 #include "libelfP.h"
25
26
27 int
28 elf_cntl (Elf *elf, Elf_Cmd cmd)
29 {
30   int result = 0;
31
32   if (elf == NULL)
33     return -1;
34
35   if (elf->fildes == -1)
36     {
37       __libelf_seterrno (ELF_E_INVALID_HANDLE);
38       return -1;
39     }
40
41   rwlock_wrlock (elf->lock);
42
43   switch (cmd)
44     {
45     case ELF_C_FDREAD:
46       /* If not all of the file is in the memory read it now.  */
47       if (elf->map_address == NULL && __libelf_readall (elf) == NULL)
48         {
49           /* We were not able to read everything.  */
50           result = -1;
51           break;
52         }
53       /* FALLTHROUGH */
54
55     case ELF_C_FDDONE:
56       /* Mark the file descriptor as not usable.  */
57       elf->fildes = -1;
58       break;
59
60     default:
61       __libelf_seterrno (ELF_E_INVALID_CMD);
62       result = -1;
63       break;
64     }
65
66   rwlock_unlock (elf->lock);
67
68   return result;
69 }