vshost-util-vserver

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

getvservercfgstyle.c (2609B)


      1 // $Id$    --*- c -*--
      2 
      3 // Copyright (C) 2003 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 "vserver.h"
     24 #include "pathconfig.h"
     25 #include "internal.h"
     26 
     27 #include <string.h>
     28 #include <sys/param.h>
     29 #include <unistd.h>
     30 #include <assert.h>
     31 
     32 static inline bool
     33 isRelPath(char const *p)
     34 {
     35   return p[0]=='.' && (p[1]=='/' || (p[1]=='.' && p[2]=='/'));
     36 }
     37 
     38 static inline bool
     39 isAbsPath(char const *p)
     40 {
     41   return p[0]=='/';
     42 }
     43 
     44 #define ISDIR	utilvserver_isDirectory(buf, true)
     45 #define ISFILE	utilvserver_isFile(buf, true)
     46 #define ISLINK	utilvserver_isLink(buf)
     47 
     48 vcCfgStyle
     49 vc_getVserverCfgStyle(char const *id)
     50 {
     51   vcCfgStyle	res = vcCFG_NONE;
     52   size_t	l1  = strlen(id);
     53   char		buf[l1 +
     54 		    MAX(sizeof(CONFDIR "/"),sizeof(DEFAULT_VSERVERDIR "/")) +
     55 		    MAX(sizeof("/legacy"),  sizeof(".conf")) - 1];
     56   char *	marker = 0;
     57   bool		is_path;
     58 
     59   strcpy(buf,    id);
     60   marker = buf+l1;
     61   strcpy(marker, "/vdir");
     62 
     63   is_path = isAbsPath(buf) || isRelPath(buf);
     64   if (is_path && (ISDIR || ISLINK))
     65     res = vcCFG_RECENT_FULL;
     66   else if (!is_path) {
     67     strcpy(buf,                         CONFDIR "/");
     68     strcpy(buf+sizeof(CONFDIR "/") - 1, id);
     69     marker = buf+sizeof(CONFDIR "/")+l1 - 1;
     70     strcpy(marker, "/vdir");
     71 
     72     if (ISDIR) res = vcCFG_RECENT_SHORT;
     73     else {
     74       strcpy(buf,                                  DEFAULT_VSERVERDIR "/");
     75       strcpy(buf+sizeof(DEFAULT_VSERVERDIR)+1 - 1, id);
     76 
     77       if (ISDIR) res = vcCFG_LEGACY;
     78     }
     79 
     80     if (res==vcCFG_LEGACY) {
     81       strcpy(buf,                            CONFDIR "/");
     82       strcpy(buf+sizeof(CONFDIR "/") - 1,    id);
     83       strcpy(buf+sizeof(CONFDIR "/")+l1 - 1, ".conf");
     84 
     85       if (!ISFILE) res = vcCFG_NONE;
     86     }
     87   }
     88 
     89 
     90   if (res==vcCFG_RECENT_FULL || res==vcCFG_RECENT_SHORT) {
     91     assert(marker!=0);
     92     strcpy(marker, "/legacy");
     93     if (access(buf, F_OK)==0) res=vcCFG_LEGACY;
     94   }
     95 
     96   return res;
     97 }