PrusaSlicer-NonPlainar/src/igl/dated_copy.cpp
2018-10-26 15:45:52 +02:00

92 lines
2.3 KiB
C++

// This file is part of libigl, a simple c++ geometry processing library.
//
// Copyright (C) 2014 Alec Jacobson <alecjacobson@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla Public License
// v. 2.0. If a copy of the MPL was not distributed with this file, You can
// obtain one at http://mozilla.org/MPL/2.0/.
#include "dated_copy.h"
#include "dirname.h"
#include "basename.h"
#include <ctime>
#include <fstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <iostream>
#if !defined(_WIN32)
#include <unistd.h>
IGL_INLINE bool igl::dated_copy(const std::string & src_path, const std::string & dir)
{
using namespace std;
// Get time and date as string
char buffer[80];
time_t rawtime;
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);
// ISO 8601 format with hyphens instead of colons and no timezone offset
strftime (buffer,80,"%Y-%m-%dT%H-%M-%S",timeinfo);
string src_basename = basename(src_path);
string dst_basename = src_basename+"-"+buffer;
string dst_path = dir+"/"+dst_basename;
cerr<<"Saving binary to "<<dst_path;
{
// http://stackoverflow.com/a/10195497/148668
ifstream src(src_path,ios::binary);
if (!src.is_open())
{
cerr<<" failed."<<endl;
return false;
}
ofstream dst(dst_path,ios::binary);
if(!dst.is_open())
{
cerr<<" failed."<<endl;
return false;
}
dst << src.rdbuf();
}
cerr<<" succeeded."<<endl;
cerr<<"Setting permissions of "<<dst_path;
{
int src_posix = fileno(fopen(src_path.c_str(),"r"));
if(src_posix == -1)
{
cerr<<" failed."<<endl;
return false;
}
struct stat fst;
fstat(src_posix,&fst);
int dst_posix = fileno(fopen(dst_path.c_str(),"r"));
if(dst_posix == -1)
{
cerr<<" failed."<<endl;
return false;
}
//update to the same uid/gid
if(fchown(dst_posix,fst.st_uid,fst.st_gid))
{
cerr<<" failed."<<endl;
return false;
}
//update the permissions
if(fchmod(dst_posix,fst.st_mode) == -1)
{
cerr<<" failed."<<endl;
return false;
}
cerr<<" succeeded."<<endl;
}
return true;
}
IGL_INLINE bool igl::dated_copy(const std::string & src_path)
{
return dated_copy(src_path,dirname(src_path));
}
#endif