vshost-util-vserver

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

createskeleton-full.hc (3180B)


      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 #include <stdlib.h>
     19 #include <string.h>
     20 #include <unistd.h>
     21 #include <sys/stat.h>
     22 #include <sys/types.h>
     23 
     24 #define CONCAT_TWO_ARGS(BUF, LHS,RHS)			\
     25   size_t		BUF ## l1 = strlen(LHS);	\
     26   size_t		BUF ## l2 = strlen(RHS);	\
     27   char			BUF[BUF##l1 + BUF##l2 + 2];	\
     28   							\
     29   memcpy(BUF,      LHS, BUF##l1 + 1);			\
     30   if (BUF##l2 > 0) {					\
     31     BUF[ BUF##l1 ] = '/';				\
     32     memcpy(BUF+ BUF##l1 + 1, RHS, BUF##l2 + 1);		\
     33   }
     34 
     35 static inline int
     36 mkdir2(char const *lhs, char const *rhs, int mode)
     37 {
     38   CONCAT_TWO_ARGS(buf, lhs, rhs);
     39   return mkdir(buf, mode);
     40 }
     41 
     42 static inline int
     43 setIAttr2(char const *lhs, char const *rhs, int flags)
     44 {
     45   CONCAT_TWO_ARGS(buf, lhs, rhs);
     46 
     47   return vc_set_iattr(buf, 0, flags, VC_IMMUTABLE_ALL);
     48 }
     49 
     50 static inline int
     51 symlink2(char const *old_lhs, char const *old_rhs,
     52 	 char const *new_lhs, char const *new_rhs)
     53 {
     54   CONCAT_TWO_ARGS(old_buf, old_lhs, old_rhs);
     55 
     56   {
     57     CONCAT_TWO_ARGS(new_buf, new_lhs, new_rhs);
     58     return symlink(old_buf, new_buf);
     59   }
     60 }
     61 
     62 #undef CONCAT_TWO_ARGS
     63 
     64 static inline int
     65 vc_createSkeleton_full(char const *id, char const *name, int flags)
     66 {
     67   if (mkdir(id, 0755)==-1) return -1;
     68 
     69   if (mkdir2(id, "apps", 0755)==-1 ||
     70       ((flags&vcSKEL_INTERFACES) && mkdir2(id, "interfaces", 755)==-1) ||
     71       ((flags&vcSKEL_PKGMGMT) && (
     72 	mkdir2(id, "apps/pkgmgmt", 0755)==-1)))
     73     return -1;
     74 
     75   for (;;) {
     76     char const	*basedir = CONFDIR "/.defaults/run";
     77 
     78     if (!utilvserver_isDirectory(basedir, true)) basedir = DEFAULT_PKGSTATEDIR;
     79     if (!utilvserver_isDirectory(basedir, true)) break;
     80 
     81     if (symlink2(basedir, name, id, "run")==-1)
     82       return -1;
     83 
     84     break;
     85   }
     86   
     87   while (flags&vcSKEL_PKGMGMT) {
     88     char const	*basedir = CONFDIR "/.defaults/apps/pkgmgmt/base";
     89 
     90     if (!utilvserver_isDirectory(basedir, true)) basedir = DEFAULT_VSERVERPKGDIR;
     91     if (!utilvserver_isDirectory(basedir, true)) break;
     92 
     93     if (mkdir2(basedir, name, 0755)==-1 ||
     94 	symlink2(basedir, name, id, "apps/pkgmgmt/base")==-1)
     95       return -1;
     96 
     97     break;
     98   }
     99 
    100   while (flags&vcSKEL_FILESYSTEM) {
    101     char const	*basedir = CONFDIR "/.defaults/vdirbase";
    102 
    103     if (!utilvserver_isDirectory(basedir, true)) basedir = DEFAULT_VSERVERDIR;
    104     if (!utilvserver_isDirectory(basedir, true)) break;
    105 
    106     if (mkdir2(basedir, name, 0755)==-1 ||
    107 	setIAttr2(basedir, name, 0)==-1 ||
    108 	symlink2(basedir, name, id, "vdir")==-1)
    109       return -1;
    110 
    111     break;
    112   }
    113 
    114   return 0;
    115 }