From: Maxim Mamontov <faust.madf@gmail.com>
Date: Thu, 22 Dec 2016 19:46:27 +0000 (+0200)
Subject: Merge branch 'stg-2.409' into stg-2.409-radius
X-Git-Url: https://git.stg.codes/stg.git/commitdiff_plain/e39f173d25ae650ee843e3d1c311abe9c1cb5ee9?ds=sidebyside;hp=-c

Merge branch 'stg-2.409' into stg-2.409-radius
---

e39f173d25ae650ee843e3d1c311abe9c1cb5ee9
diff --combined stglibs/common.lib/common.cpp
index b527ac58,fc7c35ce..7bf27397
--- a/stglibs/common.lib/common.cpp
+++ b/stglibs/common.lib/common.cpp
@@@ -32,8 -32,7 +32,8 @@@
  // Like FreeBSD4
  #include <sys/types.h>
  #include <sys/time.h>
 -#include <unistd.h>
 +#include <pwd.h>
 +#include <grp.h>
  
  #include <sys/select.h>
  
@@@ -734,6 -733,38 +734,38 @@@ void SwapBytes(int64_t & value
      value = temp;
  }
  //---------------------------------------------------------------------------
+ std::string formatTime(time_t ts)
+ {
+ char buf[32];
+ struct tm brokenTime;
+ 
+ brokenTime.tm_wday = 0;
+ brokenTime.tm_yday = 0;
+ brokenTime.tm_isdst = 0;
+ 
+ gmtime_r(&ts, &brokenTime);
+ 
+ strftime(buf, 32, "%Y-%m-%d %H:%M:%S", &brokenTime);
+ 
+ return buf;
+ }
+ //---------------------------------------------------------------------------
+ time_t readTime(const std::string & ts)
+ {
+ if (ts == "0000-00-00 00:00:00")
+     return 0;
+ 
+ struct tm brokenTime;
+ 
+ brokenTime.tm_wday = 0;
+ brokenTime.tm_yday = 0;
+ brokenTime.tm_isdst = 0;
+ 
+ stg_strptime(ts.c_str(), "%Y-%m-%d %H:%M:%S", &brokenTime);
+ 
+ return stg_timegm(&brokenTime);
+ }
+ //---------------------------------------------------------------------------
  int str2x(const std::string & str, int32_t & x)
  {
  x = static_cast<int32_t>(strtol(str.c_str(), NULL, 10));
@@@ -1080,37 -1111,3 +1112,37 @@@ std::string ToPrintable(const std::stri
  
      return dest;
  }
 +
 +uid_t str2uid(const std::string& name)
 +{
 +    const passwd* res = getpwnam(name.c_str());
 +    if (res == NULL)
 +        return -1;
 +    return res->pw_uid;
 +}
 +
 +gid_t str2gid(const std::string& name)
 +{
 +    const group* res = getgrnam(name.c_str());
 +    if (res == NULL)
 +        return -1;
 +    return res->gr_gid;
 +}
 +
 +mode_t str2mode(const std::string& name)
 +{
 +    if (name.length() < 3 || name.length() > 4)
 +        return -1;
 +
 +    if (name.length() == 4 && name[0] != '0')
 +        return -1;
 +
 +    mode_t res = 0;
 +    for (size_t i = 0; i < name.length(); ++i)
 +    {
 +        if (name[i] > '7' || name[i] < '0')
 +            return -1;
 +        res = (res << 3) + (name[i] - '0');
 +    }
 +    return res;
 +}
diff --combined stglibs/common.lib/include/stg/common.h
index a20c3d9f,8e82d2a8..d404e013
--- a/stglibs/common.lib/include/stg/common.h
+++ b/stglibs/common.lib/include/stg/common.h
@@@ -27,15 -27,17 +27,16 @@@
  #ifndef common_h
  #define common_h
  
 -#ifdef __BORLANDC__
 -#include <time.h>
 -#else
 -#include <ctime>
 -#include <climits> // NAME_MAX
 -#endif
 +#include "stg/os_int.h"
 +#include "stg/const.h"
 +
  #include <string>
  #include <sstream>
 +#include <ctime>
++#include <climits> // NAME_MAX
  
 -#include "stg/os_int.h"
 -#include "stg/const.h"
 +#include <unistd.h> // uid_t, gid_t
 +#include <sys/stat.h> // mode_t
  
  #define STAT_TIME_3         (1)
  #define STAT_TIME_2         (2)
@@@ -148,6 -150,8 +149,8 @@@ bool WriteAll(int sd, const void * sour
  
  std::string ToPrintable(const std::string & src);
  
+ std::string formatTime(time_t value);
+ time_t readTime(const std::string & value);
  //-----------------------------------------------------------------------------
  int str2x(const std::string & str, int32_t & x);
  int str2x(const std::string & str, uint32_t & x);
@@@ -299,8 -303,4 +302,8 @@@ const std::string & unsigned2str(varT x
  char * stg_strptime(const char *, const char *, struct tm *);
  time_t stg_timegm(struct tm *);
  
 +uid_t str2uid(const std::string& name);
 +gid_t str2gid(const std::string& name);
 +mode_t str2mode(const std::string& mode);
 +
  #endif