// // aegis - project change supervisor // Copyright (C) 1991-1995, 1998, 1999, 2001-2006, 2008, 2012, 2014 Peter Miller // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 3 of the License, or (at // your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #include #include #include #include #include #include #include #include #include #include #include #include #include // // NAME // copy_whole_file // // SYNOPSIS // void copy_whole_file(string_ty *from, string_ty *to, int cmt); // // DESCRIPTION // The copy_whole_file function is used to // copy a file from one place to another. // // The time-last-modified is preserved, but not the permissions. // Permissions will be 0666 and modified by the active umask. // // ARGUMENTS // from - source path // to - destination path // cmt - copy modify time of file? // // CAVEAT // Assumes that the user has already been set, // uid, gid and umask. // void copy_whole_file(string_ty *from, string_ty *to, int cmt) { trace(("copy_whole_file(from = %p, to = %p)\n{\n", from, to)); os_become_must_be_active(); trace_string(from->str_text); trace_string(to->str_text); if (to->str_length) { if (glue_copyfile(from->str_text, to->str_text)) { sub_context_ty *scp; int errno_old; errno_old = errno; scp = sub_context_new(); sub_errno_setx(scp, errno_old); sub_var_set_string(scp, "File_Name1", from); sub_var_set_string(scp, "File_Name2", to); fatal_intl(scp, i18n("cp $filename1 $filename2: $errno")); // NOTREACHED } } else { if (glue_catfile(from->str_text)) { sub_context_ty *scp; int errno_old; errno_old = errno; scp = sub_context_new(); sub_errno_setx(scp, errno_old); sub_var_set_string(scp, "File_Name", from); fatal_intl(scp, i18n("cat $filename: $errno")); // NOTREACHED } } // // copy last-time-modified of the file // if (cmt && to->str_length) { os_mtime_set(to, os_mtime_actual(from)); } trace(("}\n")); } void copy_whole_file(const nstring &from, const nstring &to, bool cmt) { copy_whole_file(from.get_ref(), to.get_ref(), cmt); } string_ty * read_whole_file(string_ty *fn) { nstring result(read_whole_file(nstring(fn))); return str_copy(result.get_ref()); } nstring read_whole_file(const nstring &fn) { nstring_accumulator acc; os_become_must_be_active(); input::pointer fp = input_file::open_text(fn); for (;;) { int c = fp->getch(); if (c == EOF) break; acc.push_back(c); } while (acc.size() > 0 && isspace((unsigned char)acc.back())) acc.pop_back(); return acc.mkstr(); } bool files_are_different(const nstring &s1, const nstring &s2) { os_become_must_be_active(); int result = glue_file_compare(s1.c_str(), s2.c_str()); if (result < 0) { int errno_old = errno; sub_context_ty sc; sc.errno_setx(errno_old); sc.var_set_string("File_Name1", s1); sc.var_set_string("File_Name2", s2); sc.fatal_intl(i18n("cmp $filename1 $filename2: $errno")); // NOTREACHED } return (result != 0); } int files_are_different(string_ty *s1, string_ty *s2) { return files_are_different(nstring(s1), nstring(s2)); } // vim: set ts=8 sw=4 et :