/*
    MoveEx 1.1
    Prepare un remplacement de fichier lors du redemarrage suivant
    p.ex. pour remplacer un fichier en cours d'utilisation
	utilise l'API MoveFileEx()

    (C) 1998 - Alexander Frink (Alexander.Frink@uni-mainz.de)
	(C) 2000 - Jean-Claude BELLAMY (Jean-Claude.Bellamy@edf.fr)
    freeware.
*/


#include <windows.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char *argv[])
{
    struct _stat buf;
    int result;

    if (argc!=3) {
        printf("\n"
               "Utilisation: %s source destination\n\n"
               "       Deplace (et renomme) 'source' en 'destination'\n"
			   "       l'operation ayant lieu lors du prochain redemarrage.\n\n"
               "       Utile pour remplacer des fichiers en cours d'utilisation.\n"
               "       Fonctionne seulement sous Windows NT et avec des disques locaux!\n"
               "       Avec des partitions NTFS, le compte SYSTEM doit avoir le droit \n"
			   "       'Controle total' sur les fichiers en question!\n"
               "       Exemples:\n"
               "           %s c:\\temp\\nouvelle_gina.dll c:\\winnt\\system32\\nwgina.dll\n"
               "              deplace la librairie 'c:\\temp\\nouvelle_gina.dll'\n"
			   "              dans le repertoire 'c:\\winnt\\system32'\n" 
			   "              et la renomme en 'nwgina.dll'\n"
			   "              S'il existe deja un fichier de ce nom dans c:\\winnt\\system32,\n"
			   "              il sera remplace par le nouveau.\n"
               "           %s test.dll c:\\temp\n"
               "              Syntaxe incorrecte : La destination doit etre un nom de fichier\n"
               "           %s c:\\test.dll d:\\test.dll\n"
               "              Syntaxe incorrecte : On ne peut pas melanger plusieurs disques\n\n"
               "(C) 1998 - Alexander Frink (Alexander.Frink@uni-mainz.de)\n"
               "(C) 2000 - Jean-Claude Bellamy (Jean-Claude.Bellamy@edf.fr)\n"		
               "(Logiciel libre)\n",argv[0],argv[0],argv[0],argv[0],argv[0]);
        return 1;
    }

    /* Verification source */
    result=_stat(argv[1],&buf);
    if (result==-1) {
        if (errno==2) {
            printf("Fichier inexistant : %s\n",argv[1]);}
        else {
			if (errno==5) {
				printf("Acces refuse au fichier %s\n",argv[1]);} 
			else {
				printf("Erreur d'acces au fichier %s: (code d'erreur=%i)\n",argv[1],errno);}
			}
        return 1;
		}

    /* Verification destination */
    result=_stat(argv[2],&buf);
    if ((result==0)&&(buf.st_mode & _S_IFDIR)) {
        printf("La destination %s est un repertoire! Nom de fichier attendu!",argv[2]);
        return 1;
    }

    if (!MoveFileEx(argv[1],argv[2],MOVEFILE_DELAY_UNTIL_REBOOT|
                                    MOVEFILE_REPLACE_EXISTING)) {
        printf("Erreur de remplacement de %s par %s: (code d'erreur=%i)\n",argv[1],argv[2],GetLastError());
        return 1;
    }
    printf("%s va remplacer %s au prochain redemarrage.\n\n"
           "Pour annuler cette operation, editer la BDR et\n"
		   "supprimer la valeur 'PendingFileRenameOperations'\n"
           "dans la clef :\n"
		   "HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\SessionManager.\n",
           argv[1],argv[2]);

    return 0;
}
