Initial commit: Mode checks for config file
authorRalf Jung <post@ralfj.de>
Fri, 9 Aug 2013 17:30:55 +0000 (19:30 +0200)
committerRalf Jung <post@ralfj.de>
Fri, 9 Aug 2013 17:30:55 +0000 (19:30 +0200)
.gitignore [new file with mode: 0644]
CMakeLists.txt [new file with mode: 0644]
dyn-nsupdate.cpp [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..378eac2
--- /dev/null
@@ -0,0 +1 @@
+build
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644 (file)
index 0000000..3865aad
--- /dev/null
@@ -0,0 +1,11 @@
+cmake_minimum_required(VERSION 2.6) 
+project(Dyn-NSupdate)
+
+FIND_PACKAGE( Boost 1.40 REQUIRED )
+INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )
+
+set(CMAKE_CXX_FLAGS "-Wall -Wextra ${CMAKE_CXX_FLAGS}")
+
+ADD_EXECUTABLE( dyn-nsupdate dyn-nsupdate.cpp )
+
+TARGET_LINK_LIBRARIES( dyn-nsupdate ${Boost_LIBRARIES} )
diff --git a/dyn-nsupdate.cpp b/dyn-nsupdate.cpp
new file mode 100644 (file)
index 0000000..e378082
--- /dev/null
@@ -0,0 +1,37 @@
+#include <iostream>
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/ini_parser.hpp>
+
+#include <sys/stat.h>
+
+int main(int argc, const char **argv)
+{
+       if (argc < 2) {
+               std::cerr << "Usage: " << argv[0] << " <configuration file>" << std::endl;
+               return 1;
+       }
+       const char *filename = argv[1];
+       
+       struct stat file_stat;
+       int ret = lstat(filename, &file_stat);
+       if (ret != 0) {
+               std::cerr << "Unable to stat " << filename << "." << std::endl;
+               return 1;
+       }
+       /* Check if the file is suited */
+       if (!S_ISREG(file_stat.st_mode)) {
+               std::cerr << filename << " is not a file." << std::endl;
+               return 1;
+       }
+       if (file_stat.st_uid != geteuid()) {
+               std::cerr << filename << " must be owned by user executing " << argv[0] << "." << std::endl;
+               return 1;
+       }
+       if (file_stat.st_mode & (S_IWGRP | S_IWOTH)) { /* can be written by group/others */
+               std::cerr << filename << " must not be writeable by group or others." << std::endl;
+               return 1;
+       }
+       
+       std::cout << "Hi world!" << std::endl;
+       return 0;
+}