Back to index

lightning-sunbird  0.9+nobinonly
InstallCleanupUnix.cpp
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
00002 /* ***** BEGIN LICENSE BLOCK *****
00003  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00004  *
00005  * The contents of this file are subject to the Mozilla Public License Version
00006  * 1.1 (the "License"); you may not use this file except in compliance with
00007  * the License. You may obtain a copy of the License at
00008  * http://www.mozilla.org/MPL/
00009  *
00010  * Software distributed under the License is distributed on an "AS IS" basis,
00011  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00012  * for the specific language governing rights and limitations under the
00013  * License.
00014  *
00015  * The Original Code is Mozilla Communicator client code.
00016  *
00017  * The Initial Developer of the Original Code is
00018  * Netscape Communications Corporation.
00019  * Portions created by the Initial Developer are Copyright (C) 1998
00020  * the Initial Developer. All Rights Reserved.
00021  *
00022  * Contributor(s):
00023  *   Don Bragg <dbragg@netscape.com>
00024  *
00025  * Alternatively, the contents of this file may be used under the terms of
00026  * either of the GNU General Public License Version 2 or later (the "GPL"),
00027  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00028  * in which case the provisions of the GPL or the LGPL are applicable instead
00029  * of those above. If you wish to allow use of your version of this file only
00030  * under the terms of either the GPL or the LGPL, and not to allow others to
00031  * use your version of this file under the terms of the MPL, indicate your
00032  * decision by deleting the provisions above and replace them with the notice
00033  * and other provisions required by the GPL or the LGPL. If you do not delete
00034  * the provisions above, a recipient may use your version of this file under
00035  * the terms of any one of the MPL, the GPL or the LGPL.
00036  *
00037  * ***** END LICENSE BLOCK ***** */
00038 
00039 
00040 #include "InstallCleanup.h"
00041 #include <sys/stat.h>
00042 #include <unistd.h>
00043 #include <string.h>
00044 
00045 //----------------------------------------------------------------------------
00046 // Native Unix file deletion function
00047 //----------------------------------------------------------------------------
00048 int NativeDeleteFile(const char* aFileToDelete)
00049 {
00050     struct stat fileStack;
00051     if (stat(aFileToDelete, &fileStack) != 0)
00052     {
00053       return DONE;// No file to delete, do nothing.
00054     }
00055     else 
00056     {
00057         if(unlink(aFileToDelete) != 0)
00058           return TRY_LATER;
00059     }
00060     return DONE;
00061 }
00062 
00063 //----------------------------------------------------------------------------
00064 // Native Unix file replacement function
00065 //----------------------------------------------------------------------------
00066 int NativeReplaceFile(const char* replacementFile, const char* doomedFile )
00067 {
00068     struct stat fileStack;
00069 
00070     // replacement file must exist, doomed file doesn't have to
00071     if (stat(replacementFile, &fileStack) != 0)
00072         return DONE;
00073 
00074     // don't have to do anything if the files are the same
00075     if (strcmp(replacementFile, doomedFile) == 0)
00076         return DONE;
00077 
00078     if (unlink(doomedFile) != 0)
00079     {
00080         if (stat(doomedFile, &fileStack) == 0)    
00081             return TRY_LATER;
00082     }
00083     else
00084     {
00085       // doomedFile is gone move new file into place
00086       if (rename(replacementFile, doomedFile) != 0)
00087           return TRY_LATER; // this shouldn't happen
00088     }
00089 
00090     return DONE;
00091 }
00092 
00093 int main(int argc,char* argv[])
00094 {
00095     HREG reg;
00096     int status = DONE;
00097     struct stat fileStack;
00098 
00099     if ( REGERR_OK == NR_StartupRegistry())
00100     {
00101         char regFilePath[256];
00102         strcpy(regFilePath, argv[0]);
00103         strcat(regFilePath, ".dat");
00104         if ( stat(regFilePath, &fileStack) != 0)
00105             regFilePath[0] =  '\0';
00106         if ( REGERR_OK == NR_RegOpen(regFilePath, &reg) )
00107         {
00108             do {
00109                 status = PerformScheduledTasks(reg);
00110                 if (status != DONE)
00111                    sleep(1);
00112             } while (status == TRY_LATER);
00113             NR_RegClose(&reg);
00114         }
00115         NR_ShutdownRegistry();
00116         unlink(regFilePath);
00117     }
00118     return(0);
00119 }
00120