| // 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 |