vshost-util-vserver

Build script and sources for util-vserver.
git clone https://ccx.te2000.cz/git/vshost-util-vserver
Log | Files | Refs

filecfg-readentrystr.c (1883B)


      1 // $Id$    --*- 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 }