]> WPIA git - cassiopeia.git/blobdiff - src/util.cpp
change to postgres with libpqxx
[cassiopeia.git] / src / util.cpp
index f3d95c0ad522f3933ab1e7e57bf94d445a28d715..40fcf25ac0dc2f5c9c6cbb3a6ab839404c20921d 100644 (file)
@@ -9,26 +9,42 @@
 #include <stdexcept>
 
 void writeFile( const std::string& name, const std::string& content ) {
-    std::ofstream file;
-
-    file.open( name );
+    std::ofstream file( name );
     file << content;
-    file.close();
+
+    //! \FIXME: Error checking
 }
 
 std::string readFile( const std::string& name ) {
     std::ifstream t( name );
     std::string res = std::string( std::istreambuf_iterator<char>( t ), std::istreambuf_iterator<char>() );
-    t.close();
 
     return res;
 }
 
 std::string writeBackFile( const std::string& serial, const std::string& cert, const std::string& keydir ) {
+    errno = 0;
+
     std::string filename = keydir;
-    mkdir( filename.c_str(), 0755 );
+
+    if( 0 != mkdir( filename.c_str(), 0755 ) ) {
+        if( EEXIST != errno ) {
+            return "";
+        }
+
+        //! \FIXME: Check this is a directory
+    }
+
     filename += "/crt";
-    mkdir( filename.c_str(), 0755 );
+
+    if( 0 != mkdir( filename.c_str(), 0755 ) ) {
+        if( EEXIST != errno ) {
+            return "";
+        }
+
+        //! \FIXME: Check this is a directory
+    }
+
     std::string first;
 
     if( serial.length() < 3 ) {
@@ -38,12 +54,21 @@ std::string writeBackFile( const std::string& serial, const std::string& cert, c
     }
 
     filename += "/" + first;
-    mkdir( filename.c_str(), 0755 );
+
+    if( 0 != mkdir( filename.c_str(), 0755 ) ) {
+        if( EEXIST != errno ) {
+            return "";
+        }
+
+        //! \FIXME: Check this is a directory
+    }
+
     filename += "/" + serial + ".crt";
     writeFile( filename, cert );
 
     return filename;
 }
+
 bool isDigit( char c ) {
     return ( c >= '0' ) && ( c <= '9' );
 }
@@ -78,13 +103,13 @@ std::pair<bool, time_t> parseDate( const std::string& date ) {
     std::size_t siz = strftime( check, 11, "%Y-%m-%d", &t );
 
     if( siz != 10 ) {
-        return std::pair<bool, time_t>( false, 0 );
+        return std::pair<bool, time_t>( false, 0 ); // NO-COVERAGE (by contract of strftime)
     }
 
     std::string checkS( check, siz );
 
     if( checkS != date ) {
-        return std::pair<bool, time_t>( false, 0 );
+        return { false, 0 };
     }
 
     return std::pair<bool, time_t>( true, res );
@@ -109,7 +134,6 @@ std::pair<bool, time_t> addMonths( std::time_t t, int32_t count ) {
     }
 
     return std::pair<bool, time_t>( true, res );
-
 }
 
 std::pair<bool, time_t> parseMonthInterval( std::time_t t, const std::string& date ) {
@@ -132,6 +156,7 @@ std::pair<bool, time_t> parseMonthInterval( std::time_t t, const std::string& da
         return std::pair<bool, time_t>( false, 0 );
     }
 }
+
 std::pair<bool, time_t> parseYearInterval( std::time_t t, const std::string& date ) {
     if( date[date.size() - 1] != 'y' ) {
         return  std::pair<bool, time_t>( false, 0 );
@@ -152,3 +177,29 @@ std::pair<bool, time_t> parseYearInterval( std::time_t t, const std::string& dat
         return std::pair<bool, time_t>( false, 0 );
     }
 }
+
+std::unique_ptr<std::ofstream> openLogfile( const std::string &name ) {
+    struct stat buffer;
+    std::string tname = name;
+    int ctr = 2;
+
+    while( stat( tname.c_str(), &buffer ) == 0 ) {
+        tname = name + "_" + std::to_string( ctr++ );
+    }
+
+    auto res = std::make_unique<std::ofstream>( tname );
+
+    if( ! res->good() ) {
+        throw std::string( "Failed to open file for logging: " ) + name;
+    }
+
+    return res;
+}
+
+std::string timestamp(){
+    time_t c_time;
+    if( time( &c_time ) == -1 ) {
+        throw std::runtime_error( "Error while fetching time?" );
+    }
+    return std::to_string( c_time );
+}