crabs_firewall-3.0.1 ©2005-2011 - Christophe CAZAJUS (crabs-mettre_le_signe_at-crabs-world.com)
1 /* 2 **============================================================================= 3 ** crabs_firewall-3.0.1 : Firewall-Masquerade avec interface http 4 ** Copyright (C) 2005-2011 : Christophe CAZAJUS (crabs-mettre_le_signe_at-crabs-world.com) 5 ** 6 ** Ce source fait partie d'un projet logiciel libre. Vous pouvez le distribuer 7 ** et/ou le modifier en respectant les termes de la GNU General Public License 8 ** version 2 ou (suite a votre propre choix) une version ulterieure. 9 ** 10 ** Ce programme est distribue dans l'espoir qu'il puisse etre utile, mais 11 ** sans aucune garantie, meme si il est associe a un produit qui vous en 12 ** propose une. Conformez-vous a la GNU General Public License pour avoir 13 ** plus de precisions. 14 ** 15 ** L'auteur ne peut etre tenu responsable de l'utilisation faite des 16 ** composantes associees a ce projet (en partie ou dans leur totalite). 17 ** 18 ** Une copie du fichier de la GNU GPL est fournie dans le repertoire DOC 19 ** de ce projet sous le nom gnu_gpl.txt 20 ** 21 **============================================================================= 22 */ 23 #include <sys/types.h> 24 #include <errno.h> 25 #include <stdarg.h> 26 #include <fcntl.h> 27 #include <stdio.h> 28 #include <unistd.h> 29 #include <stdlib.h> 30 #include <string.h> 31 #include <syslog.h> 32 33 char *str_err( char* dst, size_t sz, char* fmt, ... ) 34 { 35 va_list args ; 36 char format [1024] ; 37 char err_m [1024] ; 38 int i, j, l, n ; 39 int l_err_m ; 40 41 va_start(args, fmt ) ; 42 l = strlen(fmt) ; format[0] = 0 ; j = 0 ; 43 44 strcpy( err_m, strerror(errno) ); l_err_m = strlen(err_m) ; 45 46 for ( i=0; i<l; i++ ) 47 { 48 if ( strncmp( fmt+i, "%m",2 ) == 0 ) 49 { 50 strcat( format, err_m ) ; 51 j += l_err_m ; i++ ; 52 } 53 else 54 format[j++] = fmt[i] ; 55 format[j] = 0 ; 56 } 57 58 vsnprintf( dst, sz, format, args ) ; 59 va_end( args ); 60 return dst ; 61 } 62 63 int be_a_daemon( char *name, char *err, size_t sz ) 64 { 65 pid_t pid ; 66 67 switch ( pid = fork() ) 68 { 69 case -1 : 70 str_err(err,sz,"%s(%d):fork():%m",__FILE__,__LINE__) ; 71 return -1 ; 72 case 0 : 73 break ; 74 default : 75 printf ( "Daemon %s starting (%u) ...\n", name, pid ) ; 76 exit ( 0 ) ; 77 } 78 79 openlog( name, LOG_CONS|LOG_PID, LOG_DAEMON ) ; 80 if ( close(0) == -1 ) 81 { 82 str_err(err,sz,"%s(%d):close(0):%m",__FILE__,__LINE__) ; 83 return -1 ; 84 } 85 86 if ( close(1) == -1 ) 87 { 88 str_err(err,sz,"%s(%d):close(1):%m",__FILE__,__LINE__) ; 89 return -1 ; 90 } 91 92 if ( close(2) == -1 ) 93 { 94 str_err(err,sz,"%s(%d):close(2):%m",__FILE__,__LINE__) ; 95 return -1 ; 96 } 97 98 if ( open ( "/", O_RDONLY ) == -1 ) 99 { 100 str_err(err,sz,"%s(%d):open(/):%m",__FILE__,__LINE__) ; 101 return -1 ; 102 } 103 104 if ( dup2( 0, 1 ) == -1 ) 105 { 106 str_err(err,sz,"%s(%d):dup2(0,1):%m",__FILE__,__LINE__) ; 107 return -1 ; 108 } 109 110 if ( dup2( 0, 2 ) == -1 ) 111 { 112 str_err(err,sz,"%s(%d):dup2(0,2):%m",__FILE__,__LINE__) ; 113 return -1 ; 114 } 115 116 if ( setsid() == -1 ) 117 { 118 str_err(err,sz,"%s(%d):setsid():%m",__FILE__,__LINE__) ; 119 return -1 ; 120 } 121 return 0 ; 122 } 123
Date de génération : 22/09/2011 21:48