vshost-util-vserver

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

getvservername.c (2484B)


      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 
     26 #include <string.h>
     27 #include <fcntl.h>
     28 #include <errno.h>
     29 #include <libgen.h>
     30 #include <unistd.h>
     31 #include <limits.h>
     32 
     33 static char *
     34 getRecentName(char *start, char *end)
     35 {
     36   char		*res = 0;
     37   int		fd;
     38   char		buf[PATH_MAX];
     39   
     40   strcpy(end, "/name");
     41   fd = open(start, O_RDONLY);
     42   if (fd!=-1) {
     43     off_t	len;
     44 
     45     if ((len=lseek(fd, 0, SEEK_END))!=-1 &&
     46 	(len<VC_LIMIT_VSERVER_NAME_LEN) &&
     47 	(lseek(fd, 0, SEEK_SET)!=-1)) {
     48       char	buf[len+1];
     49 
     50       if (TEMP_FAILURE_RETRY(read(fd, buf, len+1))==len) {
     51 	while (len>0 && buf[len-1]=='\n') --len;
     52 	buf[len] = '\0';
     53 	if (len>0) res = buf;
     54       }
     55 
     56       close(fd);
     57       return strdup(res);
     58     }
     59 
     60     close(fd);
     61   }
     62 
     63   if (res==0) {
     64     *end = '\0';
     65     res  = realpath(start, buf);
     66     //printf("start='%s', res='%s'\n", start,res);
     67     if (res==0) res = start;
     68 
     69     res = basename(res);
     70   }
     71 
     72   return strdup(res);
     73 }
     74 
     75 char *
     76 vc_getVserverName(char const *id, vcCfgStyle style)
     77 {
     78   size_t		l1  = strlen(id);
     79 
     80   if (style==vcCFG_NONE || style==vcCFG_AUTO)
     81     style = vc_getVserverCfgStyle(id);
     82 
     83   switch (style) {
     84     case vcCFG_NONE		:  return 0;
     85     case vcCFG_LEGACY		:  return strdup(id);
     86     case vcCFG_RECENT_SHORT	:
     87     {
     88       char		buf[sizeof(CONFDIR "/") + l1 + sizeof("/name") - 1];
     89 
     90       strcpy(buf,                         CONFDIR "/");
     91       strcpy(buf+sizeof(CONFDIR "/") - 1, id);
     92       
     93       return getRecentName(buf, buf+sizeof(CONFDIR "/")+l1 - 1);
     94     }
     95     case vcCFG_RECENT_FULL	:
     96     {
     97       char		buf[l1 + sizeof("/name")];
     98       strcpy(buf, id);
     99 
    100       return getRecentName(buf, buf+l1);
    101     }
    102     default			:  return 0;
    103   }
    104 }