1/* $OpenLDAP$ */ 2/* This work is part of OpenLDAP Software <http://www.openldap.org/>. 3 * 4 * Copyright 2004-2011 The OpenLDAP Foundation. 5 * Portions Copyright 2004 Pierangelo Masarati. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted only as authorized by the OpenLDAP 10 * Public License. 11 * 12 * A copy of this license is available in file LICENSE in the 13 * top-level directory of the distribution or, alternatively, at 14 * <http://www.OpenLDAP.org/license.html>. 15 */ 16/* ACKNOWLEDGEMENTS: 17 * This work was initially developed by Pierangelo Masarati for inclusion 18 * in OpenLDAP Software. 19 */ 20 21#include "portable.h" 22 23#include <stdio.h> 24 25#include <ac/stdlib.h> 26 27#include <ac/ctype.h> 28#include <ac/string.h> 29#include <ac/socket.h> 30#include <sys/types.h> 31#include <sys/stat.h> 32#include <ac/unistd.h> 33#include <ac/errno.h> 34 35#include <lber.h> 36#include <ldif.h> 37#include <lutil.h> 38 39#include "slapcommon.h" 40 41#ifndef S_IWRITE 42#define S_IWRITE S_IWUSR 43#endif 44 45static int 46test_file( const char *fname, const char *ftype ) 47{ 48 struct stat st; 49 int save_errno; 50 51 switch ( stat( fname, &st ) ) { 52 case 0: 53 if ( !( st.st_mode & S_IWRITE ) ) { 54 Debug( LDAP_DEBUG_ANY, "%s file " 55 "\"%s\" exists, but user does not have access\n", 56 ftype, fname, 0 ); 57 return -1; 58 } 59 break; 60 61 case -1: 62 default: 63 save_errno = errno; 64 if ( save_errno == ENOENT ) { 65 FILE *fp = fopen( fname, "w" ); 66 67 if ( fp == NULL ) { 68 save_errno = errno; 69 70 Debug( LDAP_DEBUG_ANY, "unable to open file " 71 "\"%s\": %d (%s)\n", 72 fname, 73 save_errno, strerror( save_errno ) ); 74 75 return -1; 76 } 77 fclose( fp ); 78 unlink( fname ); 79 break; 80 } 81 82 Debug( LDAP_DEBUG_ANY, "unable to stat file " 83 "\"%s\": %d (%s)\n", 84 slapd_pid_file, 85 save_errno, strerror( save_errno ) ); 86 return -1; 87 } 88 89 return 0; 90} 91 92int 93slaptest( int argc, char **argv ) 94{ 95 int rc = EXIT_SUCCESS; 96 const char *progname = "slaptest"; 97 98 slap_tool_init( progname, SLAPTEST, argc, argv ); 99 100 if ( slapd_pid_file != NULL ) { 101 if ( test_file( slapd_pid_file, "pid" ) ) { 102 return EXIT_FAILURE; 103 } 104 } 105 106 if ( slapd_args_file != NULL ) { 107 if ( test_file( slapd_args_file, "args" ) ) { 108 return EXIT_FAILURE; 109 } 110 } 111 112 if ( !quiet ) { 113 fprintf( stderr, "config file testing succeeded\n"); 114 } 115 116 if ( slap_tool_destroy()) 117 rc = EXIT_FAILURE; 118 119 return rc; 120} 121