vshost-util-vserver

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

sigbus.c (2502B)


      1 // $Id$    --*- c -*--
      2 
      3 // Copyright (C) 2005 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 <stdbool.h>
     24 #include <stdlib.h>
     25 #include <unistd.h>
     26 #include <string.h>
     27 #include <sys/types.h>
     28 #include <sys/socket.h>
     29 
     30 #define ENSC_WRAPPERS_UNISTD	1
     31 #define ENSC_WRAPPERS_SOCKET	1
     32 #include <wrappers.h>
     33 
     34 int wrapper_exit_code = 1;
     35 
     36 #define TEST_BLOCKSIZE		(sysconf(_SC_PAGESIZE)*2 + 0x10000)
     37 
     38 static bool			is_gremlin = false;
     39 static int			sync_p[2];
     40 
     41 static void
     42 testit()
     43 {
     44   if (!is_gremlin) return;
     45 
     46   char	c;
     47 
     48   Esend(sync_p[1], ".", 1, 0);
     49   Erecv(sync_p[1], &c,  1, 0);
     50 }
     51 
     52 #define TESTSUITE_COPY_CODE	testit()
     53 
     54 #include "../unify.h"
     55 #include "../unify-copy.c"
     56 #include "../unify-settime.c"
     57 
     58 static bool
     59 checkTrunc(char const *src,
     60 	   char const *dst,
     61 	   struct stat const *st,
     62 	   size_t pos)
     63 {
     64   pid_t		pid = Efork();
     65   
     66   if (pid==0) {
     67     char		c;
     68     
     69     Erecv(sync_p[0], &c, 1, 0);
     70     Etruncate(src, pos);
     71     Esend(sync_p[0], &c, 1, 0);
     72     exit(0);
     73   }
     74 
     75   unlink(dst);
     76   return !copyReg(src, st, dst);
     77 }
     78 
     79 int main()
     80 {
     81   char		f_name0[] = "/tmp/sigbus.XXXXXX";
     82   char		f_name1[] = "/tmp/sigbus.XXXXXX";
     83   int		fd_src    = mkstemp(f_name0);
     84   int		fd_dst    = mkstemp(f_name1);
     85   char		buf[TEST_BLOCKSIZE];
     86   struct stat	st;
     87   bool		res;
     88 
     89   memset(buf, 0, TEST_BLOCKSIZE);
     90   write(fd_src, buf, TEST_BLOCKSIZE);
     91   close(fd_src);
     92   close(fd_dst);
     93 
     94   unlink(f_name1);
     95   stat(f_name0, &st);
     96   if (!copyReg(f_name0, &st, f_name1))
     97     return EXIT_FAILURE;
     98 
     99 
    100   is_gremlin = true;
    101 
    102   Esocketpair(AF_LOCAL, SOCK_STREAM, 0, sync_p);
    103   signal(SIGCHLD, SIG_IGN);
    104 
    105   res = (checkTrunc(f_name0, f_name1, &st, TEST_BLOCKSIZE/2) &&
    106 	 checkTrunc(f_name0, f_name1, &st, 0x2345));
    107 
    108   unlink(f_name0);
    109   unlink(f_name1);
    110   return res ? EXIT_SUCCESS : EXIT_FAILURE;
    111 }