f79b8762f204d8486225e40065cf771ae14a2d5d
[util-vserver.git] / lib_internal / filecfg-readentrystr.c
1 // $Id: filecfg-readentrystr.c,v 1.1 2004/07/02 23:34:52 ensc Exp $    --*- c -*--
2
3 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
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 of the License.
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
16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
18
19 #ifdef HAVE_CONFIG_H
20 #  include <config.h>
21 #endif
22
23 #include "filecfg.h"
24 #include <string.h>
25 #include <unistd.h>
26 #include <fcntl.h>
27
28 char *
29 FileCfg_readEntryStr (PathInfo const *base, char const *file,
30                       bool allow_multiline, char const *dflt)
31 {
32   PathInfo              filepath = { .d = file, .l = strlen(file) };
33   PathInfo              path     = *base;
34   char                  path_buf[ENSC_PI_APPSZ(path, filepath)];
35   int                   fd  = -1;
36   off_t                 sz;
37   char *                res = 0;
38
39   PathInfo_append(&path, &filepath, path_buf);
40   fd = open(path.d, O_RDONLY);
41   if (fd==-1) goto err;
42
43   sz = lseek(fd, 0, SEEK_END);
44   if (sz==-1 ||
45       lseek(fd, 0, SEEK_SET)==-1) goto err;
46   
47   
48   if (sz>0 && sz<FILECFG_MAX_FILESIZE) {
49     char                buf[sz+1];
50     
51     if (read(fd, buf, sz+1)!=sz) goto err;
52
53     if (!allow_multiline) {
54       char *            pos;
55       
56       buf[sz] = '\0';
57       pos     = strchr(buf, '\n');
58       if (pos) *pos = '\0';
59     }
60     else {
61       while (sz>0 && buf[sz-1]=='\n') --sz;
62       buf[sz] = '\0';
63     }
64
65     res = strdup(buf);
66   }
67
68   err:
69   if (res==0 && dflt)
70     res = strdup(dflt);
71   
72   if (fd!=-1) close(fd);
73   return res;
74 }