home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1994 #1
/
monster.zip
/
monster
/
PCBOARD
/
PCBM102.ZIP
/
SOURCES.ZIP
/
PCBMOVE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-22
|
37KB
|
1,165 lines
/*
┌────────────────────────────────────────────────────────────────────────┐
│ │
│ ▒▒▒▒▒▒▄ ▒▒▒▒▒▒▄ ▒▒▒▒▒▒▒▄ ▒▒▒▒▒▒▒▒▄ ▒▒▒▒▒▒▄ ▒▒▄ ▒▒▄ ▒▒▒▒▒▒▄ │
│ ▒▒█▀▒▒█ ▒▒█▀▀▀▀ ▒▒█▀▒▒█ ▒▒█▒▒█▒▒█ ▒▒█▀▒▒█ ▒▒█ ▒▒█▀ ▒▒█▀▀▀▀ │
│ ▒▒▒▒▒▒█ ▒▒█ ▒▒▒▒▒█▀ ▒▒█▒▒█▒▒█ ▒▒█ ▒▒█ ▒▒█ ▒▒█▀ ▒▒▒▒▄ │
│ ▒▒█▀▀▀▀ ▒▒█ ▒▒█▀▒▒█ ▒▒█ ▀▀▒▒█ ▒▒█ ▒▒█ ▒▒█▒▒█▀ ▒▒█▀▀ │
│ ▒▒█ ▒▒▒▒▒▒▄ ▒▒▒▒▒▒▒█ ▒▒█ ▒▒█ ▒▒▒▒▒▒█ ▒▒▒█▀ ▒▒▒▒▒▒▄ │
│ ▀▀ ▀▀▀▀▀▀ ▀▀▀▀▀▀▀ ▀▀ ▀▀ ▀▀▀▀▀▀ ▀▀▀ ▀▀▀▀▀▀ │
│ │
│ Module : PCBMOVE.C - Module Principal - │
│ │
│ │
└────────────────────────────────────────────────────────────────────────┘
*/
/* My apologies to everyone, but comments in this code are in french... */
/* However, most variables and functions names are "english", maybe that */
/* will help you much more than comments :-) */
/* If something is _really_ uncrackable, just ask me !!! */
/* Enjoy */
#include <ctype.h>
#include <fcntl.h>
#include <io.h>
#include <malloc.h>
#include <memory.h>
#include <share.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/locking.h>
#include "install.h"
#include "pcbmove.h"
#include "mystring.h"
#include "system.h"
#include "strings.h"
#include "pcbmove.ini"
/*------------- Seul endroit pour modifier le numéro de version -----*/
/* */
char *__Version__ = "1.02";
/* */
/*-------------------------------------------------------------------*/
/*---------------------------------------------------------------------*/
char Program_Name [MAX_PATH]; /* Nom complet de l'executable */
struct InstallType Install;
char **_Strings;
char **_months_;
char **_days_;
char config_file [MAX_PATH]; /* path du fichier de config passé en argument */
char file_to_move [14]; /* nom du fichier à déplacer */
int area_ori, area_tar; /* numéro des areas d'origine et destination */
int descript_length; /* taille en octets de la description */
char fullname_ori[MAX_PATH], fullname_tar[MAX_PATH];
/* nom complet (fullpath) du fichier à bouger */
char list_ori[MAX_PATH], list_tar[MAX_PATH];
/* nom complet des 2 file list à modifier */
long offset_list_ori, offset_list_tar;
/* position dans le fichier des filelist ou */
/* doit etre ajouté ou effacé la description */
char FromField[33]; /* Nom utilisateur qui a écrit à PCBMOVE */
char DateField[9];
char HeureField[6]; /* date et heure du message */
int AreaFound; /* Area où a été trouvé le fichier */
struct ConfigType Config; /* structure du fichier de config */
char tampon [99]; /* variable servant à faire des bidouilles */
char tampon1[99]; /* sur des strings */
char far *init; /* pointeur pour le malloc */
unsigned bloc; /* taille du bloc de caractère lu dans le
/* fichier de description */
/* (c'est un peu merdique, mais ca marche) */
main(int argc,char **argv)
{
int i;
_Strings = _StringsFRENCH; /* au début, tout est en francais */
_days_ = _days_FRENCH;
_months_ = _months_FRENCH;
if(*argv[1] == '?') /* affiche les errors level */
{
printf(_Strings[M_ErrorLevel]);
return(ERROR);
}
if(_osmajor <3) /* si dos inf à 3, on sort */
{
printf(_Strings[M_BadDos]);
return(ERROR);
}
strcpy(Program_Name,argv[0]); /*<<--^^--à cause de ça entre autres... */
if( ReadExe() ) /* Lit la date & le CRC dans l'exe */
return (-1 );
printf (_Strings[M_CompilDate], __Version__, frtime(Install.CompilTime));
/* affiche la version et la date de compilation */
if (argc != 5 && argc != 2) /* 4 arguments si en mode batch */
{ /* 1 argument si mode scanmail. */
printf(_Strings[M_Usage]);
return(ERROR);
}
i = argc;
while( i > 1 ) /* passe tous les caractères en MAJUSCULE */
strupr (argv[--i] );
strcpy (config_file, argv[1]); /* fichier de config */
if(access (config_file,04) ) /* si peux pas acceder en lecture */
{ /* c'est qu'il y a un problème de config */
printf(_Strings[M_NoConfigFile], config_file);
return(ERROR);
}
if(charge_config() == ERROR) /* si peux pas acceder en lecture */
{ /* c'est qu'il y a un problème de config */
printf (_Strings[M_BadConfigFile], config_file);
return(ERROR);
}
if (argc == 2){
return (scan_mail()); /* mode scan mail */
} else {
strcpy (file_to_move, argv[2]); /* fichier à déplacer */
area_ori = atoi (argv[3]); /* area d'origine */
area_tar = atoi (argv[4]); /* area de destination */
if (area_ori == area_tar)
return ERROR;
strcpy (FromField, "LOCAL");
return (move()); /* mode batch */
} /* fin if */
}
/*-----------------------------------------------------------------------*/
int move () /* move proprement dit */
{
int code_retour;
bloc = 65000;
if ((init = (char far *) malloc (bloc)) == NULL)
{
puterrorlog (_Strings[L_Malloc65KError]);
return ERROR;
}
if (*Config.DebugFlag == ON)
printf (_Strings[M_CheckFileToMove]);
code_retour = test_validite (); /* test pour savoir si le move est */
/* possible et renseigne la */
/* variable offset_list_ori */
if (code_retour != OK) {free (init); return (code_retour);}
if (*Config.DebugFlag == ON)
printf (_Strings[M_SeekDescript]);
where_to_put_tar (list_tar); /* trouve l'endroit où insérer le fichier */
/* dans la liste et */
/* renseigne la variable offset_list_tar */
if (*Config.DebugFlag == ON)
printf (_Strings[M_OffsetsInFileList], offset_list_ori, offset_list_tar);
if (*Config.DebugFlag == ON)
printf(_Strings[M_MAJinFileList]);
code_retour = maj_listes(); /* on créé les nouvelles filelist */
if (code_retour != OK) {free (init); return (code_retour);}
if (*Config.DebugFlag == ON)
{
printf (_Strings[M_ReplaceFileList], area_ori);
renbak (list_ori); /* Si debug, on fait un .BAK de la filelist */
} else {
remove (list_ori); /* sinon on efface l'ancien */
} /* fin if */
code_retour = move_physique (Config.TempFile1, list_ori);
if (code_retour != OK) {free (init); return (code_retour);}
/* on remplace l'ancien filelist par la nouvelle */
if (*Config.DebugFlag == ON)
{
printf (_Strings[M_ReplaceFileList], area_tar);
renbak (list_tar); /* Si debug, on fait un .BAK de la filelist */
} else {
remove (list_tar); /* sinon on efface l'ancien */
} /* fin if */
code_retour = move_physique (Config.TempFile2, list_tar);
if (code_retour != OK) {free (init); return (code_retour);}
/* on remplace l'ancien filelist par la nouvelle */
if (*Config.DebugFlag == ON)
printf (_Strings[M_PhysicalMove], file_to_move);
code_retour = move_physique (fullname_ori, fullname_tar);
/* move physique du fichier */
if (code_retour != OK)
return (code_retour);
putuselog (_Strings[L_MoveOK], file_to_move, area_ori, area_tar, FromField);
/* Ajout dans le fichier log */
free (init);
return OK;
}
/* FIN DU PROGRAMME */
/*------------------------------------------------------------------------*/
/*------------------------------------------------------------------------*/
/*
* CHARGE_CONFIG : Charge le fichier de configuration et met à jour.
* la structure Config en conséquence
* Retourne ERROR en cas de problème
*
* Remarque : Il est indispensable de trouver TOUS les champs de
* config dans le fichier .cfg. En effet, on utilise la
* même structure pour le nom des champs est son contenu
* C'est pas très clair, mais c'est la raison d'être du
* fichier PCBMOVE.INI qui contient les chaines reconnues
* dans le .cfg
*/
int charge_config ()
{
FILE *fin;
int i;
int compt=0; /* compte le nombre de ligne lu dans le fichier */
if ((fin = fopen(config_file, "rt")) == NULL)
return ERROR;
while (fgets (tampon, 90, fin) != NULL)
{
_Clean(tampon); /* on nettoie la string */
i = 0;
if (*tampon == '#') continue; /* si commentaire on continue */
if (strlen(tampon) < 3) continue; /* Si ligne vide, on continue */
compt++;
while (tampon[++i] != '=') /* on cherche le '=' */
if (tampon[i] == 0) { fclose (fin); return ERROR; }
/* si pas trouvé, ERROR */
tampon[i++] = 0 ; /* on remplace le '=' par 0 et */
/* i pointe juste après ce 0 */
if (!strcmp (tampon, Config.DirList)) /* on compare à tous les champs*/
strcpy (Config.DirList, tampon+i); /* de la structure Config */
if (!strcmp (tampon, Config.MessageBase))
strcpy (Config.MessageBase, tampon+i);
if (!strcmp (tampon, Config.UserBase))
strcpy (Config.UserBase, tampon+i);
if (!strcmp (tampon, Config.UserFileNameError))
strcpy (Config.UserFileNameError, tampon+i);
if (!strcmp (tampon, Config.UserAreaError))
strcpy (Config.UserAreaError, tampon+i);
if (!strcmp (tampon, Config.UserOtherAreaError))
strcpy (Config.UserOtherAreaError, tampon+i);
if (!strcmp (tampon, Config.UserAreaOriForbid))
strcpy (Config.UserAreaOriForbid, tampon+i);
if (!strcmp (tampon, Config.UserAreaTarForbid))
strcpy (Config.UserAreaTarForbid, tampon+i);
if (!strcmp (tampon, Config.UserNeedForward))
strcpy (Config.UserNeedForward, tampon+i);
if (!strcmp (tampon, Config.ErrorLogFile))
strcpy (Config.ErrorLogFile, tampon+i);
if (!strcmp (tampon, Config.UserLogFile))
strcpy (Config.UserLogFile, tampon+i);
if (!strcmp (tampon, Config.UseLogFile))
strcpy (Config.UseLogFile, tampon+i);
if (!strcmp (tampon, Config.TempFile1))
strcpy (Config.TempFile1, tampon+i);
if (!strcmp (tampon, Config.TempFile2))
strcpy (Config.TempFile2, tampon+i);
if (!strcmp (tampon, Config.ToField))
strcpy (Config.ToField, tampon+i);
if (!strcmp (tampon, Config.ForwardUser))
strcpy (Config.ForwardUser, strupr(tampon+i));
if (!strcmp (tampon, Config.Security))
strcpy (Config.Security, tampon+i);
if (!strcmp (tampon, Config.NotAreaOri))
Chaine2int (tampon+i, Config.NotAreaOri);
if (!strcmp (tampon, Config.NotAreaTar))
Chaine2int (tampon+i, Config.NotAreaTar);
if (!strcmp (tampon, Config.DebugFlag))
if (!strcmp (strupr(tampon+i), "ON"))
*Config.DebugFlag = ON;
else *Config.DebugFlag = OFF;
if (!strcmp (tampon, Config.Language))
strcpy (Config.Language, tampon+i);
} /* fin while */
fclose (fin);
if (!strcmp (strupr (Config.Language), "FRENCH"))
{
_Strings = _StringsFRENCH; /* on fait pointer _Strings vers les */
_days_ = _days_FRENCH; /* chaines françaises ou anglaises */
_months_ = _months_FRENCH;
} else {
_Strings = _StringsUS;
_months_ = _months_US;
_days_ = _days_US;
} /* fin if */
if (compt == 21) /* Si y'a pas 21 champs dans le */
return OK; /* le fichier de config, c'est qu'il */
else /* y a un problème */
return ERROR;
}
/*------------------------------------------------------------------------ */
/*
* READEXE : Lit l'executable, remplie la structure installe
* et vérifie par CRC que rien n'a été patché
*/
int ReadExe (void)
{
int fin;
long taille;
int crc;
if((fin = open(Program_Name,O_RDWR|O_BINARY,S_IREAD|S_IWRITE)) == -1)
{
printf (_Strings[M_CanNotReadExe]);
return ERROR; /* mais c'est peu probable...*/
}
taille= filelength(fin);
lseek(fin,taille - (long)sizeof(Install),SEEK_SET);
/* on se positionne n octets avant */
/* la fin du fichier */
read(fin,(char *)&Install.CrcTest,sizeof(Install));
close(fin);
crc = (int) calcrc((char *)&Install.StruVer,sizeof(Install) -2);
if((int) Install.CrcTest != crc )
{ /* on vérifie le CRC */
printf(_Strings[M_ExeHasBeenPatched], Program_Name);
return (ERROR);
}
return (OK);
}
/*------------------------------------------------------------------------*/
/*
* PUTLOG : Ecrit un message formatté dans le fichier log.
* Retourne un pointeur sur la chaine (statique)
* écrite, dans tous les cas.
* L'écriture ne doit pas dépasser 1024 octets, mais 56 octets
* sera un maximum pour une présentation propre.
*
* La date d'écriture est notée avant le message.
*/
void puterrorlog(char *format,...)
{
va_list ap; /* pour les paramètres variables */
FILE *fin;
char Buffer[255];
long t ;
va_start (ap,format); /* trouve le premier argument variable */
vsprintf (Buffer,format,ap); /* met dans buffer la chaine du log */
va_end (ap);
time ( &t );
if(( fin = fopen(Config.ErrorLogFile,"a") ) != NULL )
{ /* rajoute la date */
fprintf(fin,"■ %s : %-80s ■\n", sfrtime ( t ),Buffer );
printf("■ %s : %-80s ■\n", sfrtime ( t ),Buffer );
fclose(fin);
}
return;
}
/*------------------------------------------------------------------------*/
void putuserlog(char *format,...)
{
va_list ap;
FILE *fin;
char Buffer[255];
long t ;
va_start (ap,format); /* trouve le premier argument variable */
vsprintf (Buffer,format,ap); /* met dans buffer la chaine du log */
va_end (ap);
time ( &t );
if(( fin = fopen(Config.UserLogFile,"a") ) != NULL )
{
fprintf(fin,"■ %s : %-80s ■\n", sfrtime ( t ),Buffer );
if (*Config.DebugFlag == ON)
printf("■ %s : %-80s ■\n", sfrtime ( t ),Buffer );
fclose(fin);
}
return;
}
/*------------------------------------------------------------------------*/
void putuselog(char *format,...)
{
va_list ap;
FILE *fin;
char Buffer[255];
long t ;
va_start (ap,format); /* trouve le premier argument variable */
vsprintf (Buffer,format,ap); /* met dans buffer la chaine du log */
va_end (ap);
time ( &t );
if(( fin = fopen(Config.UseLogFile,"a") ) != NULL )
{
fprintf(fin,"■ %s : %-80s ■\n", sfrtime ( t ),Buffer );
if (*Config.DebugFlag == ON)
printf("■ %s : %-80s ■\n", sfrtime ( t ),Buffer );
fclose(fin);
}
return;
}
/*------------------------------------------------------------------------*/
/* TEST_VALIDITE :
* . Vérifie que les areas ne sont pas interdites (origine et destination)
* . Construit tous les chemins (file lists et fichier à bouger).
* . Vérifie l'existence physique du fichier.
* . Vérifie l'existence du répertoire de destination.
* . Vérifie l'existence des fichiers de description.
* . Vérifie l'existence du fichier dans la description de l'area
*/
int test_validite (void)
{
int code_retour;
unsigned i;
unsigned max_area;
max_area = getmaxarea ();
for (i=0;i<=max_area ;i++ ){
if (Config.NotAreaOri[i] == area_ori)
{
putuserlog (_Strings[L_FromForbidenMove], area_ori, FromField);
return ORIFORBIDEN;
} /* fin if */
if (Config.NotAreaTar[i] == area_tar)
{
putuserlog (_Strings[L_ToForbidenMove], area_tar, FromField);
return TARFORBIDEN;
} /* fin if */
} /* fin for */
code_retour = getfilelist(area_ori); /* met dans tampon le nom complet */
if (code_retour != OK) return code_retour;
strcpy (list_ori, tampon);
code_retour = getfilelist(area_tar); /* met dans tampon le nom complet */
if (code_retour != OK) return code_retour;
strcpy (list_tar, tampon);
code_retour = getfilename (area_ori); /* retourne le nom complet d' */
if (code_retour != OK) return code_retour; /* origine du fichier à déplacer*/
sprintf (fullname_ori, "%s%s", tampon, file_to_move);
code_retour = getfilename (area_tar); /* retourne le nom complet de desti- */
if (code_retour != OK) return code_retour; /* nation du fichier à déplacer */
sprintf (fullname_tar, "%s%s", tampon, file_to_move);
strcpy (tampon, fullname_tar);
*strrchr (tampon, '\\') = 0;
if(access (tampon,00)) /* le répertoire de destination n'existe */
{ /* pas. y'a un schmilblic. On arrete là */
puterrorlog (_Strings[L_TargetDirNotExist], tampon);
return ERROR;
}
if(access (list_ori,06)) /* si peux pas acceder en lecture */
{ /* et écriture, c'est que la filelist */
/* d'origine a un problème */
puterrorlog (_Strings[L_CanNotOpenReadMode], list_ori);
return ERROR;
}
if (access (list_tar,06)) /* si peux pas acceder en lecture */
{ /* et écriture, c'est que la filelist */
/* de destination a un problème */
puterrorlog (_Strings[L_CanNotOpenReadMode], list_tar);
return ERROR;
}
code_retour = is_file_in_list (list_ori);
if (code_retour == NON) {
/* le fichier n'est pas dans la liste de l'area spécifiée */
/* on pourra plus tard, chercher s'il est dans d'autres AREA */
putuserlog (_Strings[L_FileNotInList], file_to_move, area_ori, FromField);
return NOTINLIST;
}
if (code_retour == ERROR) {
/* y'a un problème sérieux d'acces aux fichiers */
/* on a mis l'info dans le fichier LOG des erreur */
return ERROR;
}
if(access (fullname_ori,06)) /* si peux pas acceder en lecture */
{ /* et écriture, c'est qu'on ne peut pas */
/* le déplacer */
puterrorlog (_Strings[L_FileNotPhysicExist], fullname_ori);
return ERROR;
}
return OK;
}
/*------------------------------------------------------------------------*/
/* GETFILENAME : met dans tampon le dir du fichier à déplacer.
* Le path est construit grace au DIR.LST d'après le numéro
* de l'area passé en argument
*/
int getfilename (int area)
{
FILE *fin;
int i=0;
if ((fin = _fsopen (Config.DirList, "rb", SH_DENYNO )) == NULL)
{
puterrorlog (_Strings[L_CanNotOpenReadMode], Config.DirList);
return ERROR;
}
do {
i++;
if ( fgets (tampon, 97, fin) == NULL)
{
putuserlog (_Strings[L_AreaNotExist], area, FromField);
fclose (fin);
return AREANOTEXIST;
}
} while (i != area ); /* fin do */
tampon[60] = 0;
strcpy (tampon1, tampon+30);
strcpy (tampon, strclean(tampon1));
_Clean (tampon);
fclose (fin);
return OK;
}
/*------------------------------------------------------------------------*/
/* GETFILELIST : met dans tampon le nom du fichier de la filelist.
* Le path est construit grace au DIR.LST d'après le numéro
* de l'area passé en argument
*/
int getfilelist (int area)
{
FILE *fin;
int i=0;
if ((fin = _fsopen (Config.DirList, "rt", SH_DENYNO)) == NULL)
{
puterrorlog (_Strings[L_CanNotOpenReadMode], Config.DirList);
return ERROR;
}
do {
i++;
fgets (tampon, 97, fin);
} while (i != area ); /* fin do */
tampon[30] = 0;
strclean(tampon);
_Clean (tampon);
fclose (fin);
return OK;
}
/*------------------------------------------------------------------------*/
/* GETAREANAME : met dans tampon la description de l'area spécifiée
*/
int getareaname (int area)
{
FILE *fin;
int i=0;
if ((fin = _fsopen (Config.DirList, "rb", SH_DENYNO)) == NULL)
{
puterrorlog (_Strings[L_CanNotOpenReadMode], Config.DirList);
return ERROR;
}
do {
i++;
fgets(tampon, 97, fin);
} while (i != area ); /* fin do */
tampon[95] = 0;
strcpy (tampon1, tampon+60);
strcpy (tampon, strclean(tampon1));
_Clean (tampon);
fclose (fin);
return OK;
}
/*------------------------------------------------------------------------*
* IS_FILE_IN_LIST : Cherche le fichier file_to_move dans le fichier de
* description dont le nom est passé en argument.
*
* Si trouvé, retourne OUI et renseigne offset_list_ori
* qui servira à enlevé la description
* Si pas trouvé, retourne NON.
*/
int is_file_in_list (char *file)
{
int fin;
unsigned compteur=0;
int TROUVE = ERROR;
unsigned i;
char far *fptr = init;
int len_filename;
len_filename = strlen(file_to_move);
bloc = 65000;
if ((fin = sopen (file, O_RDONLY | O_BINARY, SH_DENYNO)) == - 1)
{
puterrorlog (_Strings[L_CanNotOpenReadMode], file);
return ERROR;
}
_fmemset (init, 0, bloc);
do {
if (read(fin, fptr, bloc) == 0) break;
bloc = 64900; /* on a lu 65000 car */
fptr = init; /* pour prévoir le cas ou le nom du fichier */
/* est coupé au milieu d'un bloc, on ne considère */
/* donc que 64900 caractères . Les 100 restants */
/* permettent de faire le lien */
for (i=0 ;i < 64915 ;fptr++, i++){
if (*fptr == 10) /* si retour chariot, on cherche + loin */
{
i++;
if (*(++fptr) != *file_to_move) continue; /* si première lettre */
/* pas bon, on passe */
*(fptr+len_filename) = 0;
if (!strcmp (fptr, file_to_move)) {TROUVE = OK; break;}
/* si trouvé, on sort */
} /* fin if */
} /* fin for */
if (TROUVE == OK){
offset_list_ori = i + (long)compteur * 64900; /* on calcule l'offset */
close (fin); /* du fichier */
return OUI;
} /* fin if */
_fmemcpy (init, fptr-15, 100); /* on enleve 15 au cas ou le nom */
/* du fichier soit coupé en fin */
/* de malloc, et on recopie les 100 */
compteur++;
fptr = init+100;
_fmemset (fptr, 0, (size_t) 64900);
} while (1); /* fin do */
close (fin);
return NON;
}
/*------------------------------------------------------------------------
* WHERE_TO_PUT_TAR: Cherche l'endroit où il faudra insérer la description.
* Pour cela il renseigne offset_list_tar.
*
*/
void where_to_put_tar (char *file)
{
int fin;
int code_retour, avant = -1;
unsigned compteur=0;
int TROUVE = ERROR;
register unsigned i;
char far *fptr = init;
int fin_fichier = NON;
bloc = 65000;
fin = sopen (file, O_RDONLY | O_BINARY, SH_DENYNO);
_fmemset (init, 0, bloc);
do {
if (read(fin, fptr, bloc) == 0) break;
bloc = 64900;
fptr = init;
for (i=0 ;i < 64915 ;fptr++, i++){
if (*fptr == 10 && !isspace (*(fptr+1))){
i++; fptr++;
*(fptr+12) = 0; /* on coupe la string apres le nom */
code_retour = strcmp (fptr, file_to_move);
if (code_retour + avant == 0) {TROUVE = OK; break;}
avant = code_retour;
if (*(fptr+13) == 0){/* on est arrive au bout fichier */
fin_fichier = OUI;/* on met le flag de dépassement pour ajout */
TROUVE = OK;
break;
} /* fin if */
} /* fin if */
} /* fin for */
if (TROUVE == OK){
if (fin_fichier == NON){
offset_list_tar = i + (long)compteur * 64900;
} else {
offset_list_tar = filelength (fin);
} /* fin if */
close (fin);
return;
} /* fin if */
_fmemcpy (init, fptr-15, 100); /* on enleve 15 au cas ou */
/* l'endroit qui nous intéresse */
/* est coupé entre les 2 malloc */
fptr = init+100;
_fmemset (fptr, 0, (size_t) 64900);
compteur++;
} while (1); /* fin do */
close (fin);
return;
}
/*------------------------------------------------------------------------
* MAJ_LISTES : Fait les modifs des 2 filelist et sauve le résultat dans
* des fichiers temporaires.
*
*/
int maj_listes (void)
{
int fin;
int fout;
char far *init1;
char far *fptr = init;
long local_offset = 0;
int i;
bloc = 65000;
if ((fin = sopen (list_ori, O_RDONLY | O_BINARY, SH_DENYWR )) == - 1)
{
puterrorlog (_Strings[L_CanNotOpenReadMode], list_ori);
return ERROR;
}
locking (fin, LK_LOCK, filelength (fin));
if ((fout = open (Config.TempFile1, O_BINARY | O_CREAT | O_WRONLY, S_IWRITE))
== - 1)
{
puterrorlog (_Strings[L_CanNotCreateTempo], Config.TempFile1);
return ERROR;
}
if ((init1 = (char far *) malloc (2020)) == NULL)
{ /* malloc pour stocker la description */
puterrorlog (_Strings[L_Malloc2KError]);
close (fin);
close (fout);
return ERROR;
}
do {
if (offset_list_ori <= local_offset+bloc)
bloc = offset_list_ori - local_offset;
/* si on peut lire toutes les descriptions */
/* d'un coup arriver à celle voulue, */
/* on diminue le read pour arriver */
/* "au ras" */
read(fin, init, bloc);
write (fout, init, bloc); /* écrit dans le fichier temporaire */
local_offset += bloc; /* local_offset est la position actuelle dans */
/* le fichier */
} while (offset_list_ori != local_offset); /* fin do */
/* boucle qui lit toute les descriptions avant celle recherchée */
read(fin, init, bloc = 65000);
/* on lit un nouveau bloc */
_fmemcpy (init1, init, 2000);
/* copie 2000K pour garder la description */
for (i=0;i < 2000 ;i++ )
{
if (*(init1+i) == 10 && *(init1+i+1) != ' ')
{ /* on detecte la fin de description */
descript_length = ++i; /* dès qu'il n'y a plus un CR suivi */
break; /* d'un blanc */
}
}
if (i == 2000)
{
puterrorlog (_Strings[L_DescriptTooLong], file_to_move);
_ffree (init1);
close (fin);
close (fout);
return ERROR;
}
bloc -= descript_length; /* shift de la mémoire pour virer */
local_offset += descript_length; /* la description qu'on ne veut pas */
_fmemmove (init, init+descript_length, bloc);
do {
if (filelength (fin) <= local_offset+bloc)
{ /* si c'est le dernier morceau de 65000 */
if (local_offset < filelength(fin)){
bloc = (unsigned) (filelength(fin) - local_offset);
write (fout, init, bloc);
} /* fin if */
close (fin);
close (fout);
break;
} /* fin if */
write (fout, init, bloc);
local_offset += bloc;
bloc = 65000;
read (fin, init, bloc);
} while (1); /* fin do */
/* ******* 1ere partie ***************
La description a été enlevé du fichier d'origine
************************************** */
if ((fin = open (list_tar, O_RDONLY | O_BINARY, SH_DENYWR)) == - 1)
{
puterrorlog (_Strings[L_CanNotOpenReadMode], list_tar);
return ERROR;
}
locking (fin, LK_LOCK, filelength (fin));
if ((fout = open (Config.TempFile2, O_BINARY | O_CREAT | O_WRONLY, S_IWRITE))
== - 1)
{
puterrorlog (_Strings[L_CanNotCreateTempo], Config.TempFile2);
return ERROR;
}
local_offset = 0; /* RAZ Variables */
bloc = 65000;
do {
if (offset_list_tar <= local_offset+bloc)
bloc = offset_list_tar - local_offset;
read(fin, init, bloc); /* si on peut lire toutes les descriptions */
/* d'un coup arriver à celle voulue, */
/* on diminue le read pour arriver */
/* "au ras" */
write (fout, init, bloc);
local_offset += bloc;
} while (offset_list_tar != local_offset); /* fin do */
bloc = 65000;
_fmemcpy (init, init1, descript_length); /* on ajoute la desciption */
if (filelength (fin) - local_offset < bloc - descript_length) {
/* si on a la place de mettre la fin du fichier */
bloc = filelength (fin) -local_offset;
read (fin, init+descript_length, bloc);
/* on lit le reste du fichier */
write (fout, init, bloc + descript_length);
goto fin; /* a ke C pas bo ça :-) */
} else {
read (fin, init+descript_length, bloc-descript_length);
local_offset += bloc-descript_length; /* on a pas lu 65000 car, mais 65000-*/
/* la description ajoutée */
write (fout, init, bloc);
} /* fin if */
read (fin, init, bloc);
/* on arrive là pour écrire tout la fin du fichier */
do {
if (filelength (fin) <= local_offset+bloc)
{
bloc = (unsigned) (filelength(fin) - local_offset);
write (fout, init, bloc);
break;
} /* fin if */
write (fout, init, bloc);
local_offset += bloc;
bloc = 65000;
read (fin, init, bloc);
} while (1); /* fin do */
/* ********* 2eme partie *************
La description a été ajoutée dans le fichier de destination.
*********************************** */
fin: /* he oui .... ya un goto un peu plus haut */
close (fin);
close (fout);
_ffree (init1);
return OK;
}
/*------------------------------------------------------------------------
* MOVE_PHYSIQUE : Déplace un fichier selon 2 méthodes :
* . Si c'est sur le même disque, on fait appel au MOVE du dos.
* . Si c'est dur des disques différents, on copie le fichier puis
* efface l'original.
*/
int move_physique (char *file1, char *file2)
{
long offset = 0;
long taille;
int fin, fout;
char far *ptr; /* pointeur pour le malloc */
if (*file1 == *file2) /* on peut seulement faire un MOVE */
{ /* car le disque est le même */
if (*Config.DebugFlag == ON)
printf ("move par rename\n");
return (rename (file1, file2));
} else {
if (*Config.DebugFlag == ON)
printf ("move physique\n");
if ((fin = sopen (file1, O_RDONLY | O_BINARY, SH_DENYRW)) == - 1)
{
puterrorlog (_Strings[L_CanNotOpenForMove], file1);
return ERROR;
}
locking (fin, LK_LOCK, filelength (fin));
if ((fout = open (file2, O_BINARY | O_CREAT | O_WRONLY, S_IWRITE))
== - 1)
{
puterrorlog (_Strings[L_CanNotOpenForMove], file2);
close (fin);
return ERROR;
}
taille = filelength (fin);
bloc = 65000;
if ((ptr = (char far *) malloc (bloc)) == NULL)
{
puterrorlog (_Strings[L_Malloc65KError]);
close (fin);
close (fout);
return ERROR;
}
do {
if (taille < offset+bloc)
bloc = taille - offset;
/* si on arrive au bout, on lit seulement */
/* jusqu'à la fin. */
read (fin, ptr, bloc);
if (write (fout, ptr, bloc) == -1)
{
puterrorlog (_Strings[L_ProblemDuringMove], file1);
close (fin);
close (fout);
free (ptr);
return ERROR;
}
offset += bloc;
} while (taille != offset); /* fin do */
close (fin);
close (fout);
free (ptr);
remove (file1);
} /* fin if */
return OK;
}
/*------------------------------------------------------------------------
* COPY_PHYSIQUE : Copy un fichier
*/
int copy_physique (char *file1, char *file2)
{
long offset = 0;
long taille;
int fin, fout;
char far *ptr; /* pointeur pour le malloc */
if ((fin = sopen (file1, O_RDONLY | O_BINARY, SH_DENYNO )) == - 1)
return ERROR;
if ((fout = open (file2, O_BINARY | O_CREAT | O_WRONLY, S_IWRITE)) == - 1)
return ERROR;
taille = filelength (fin);
bloc = 65000;
if ((ptr = (char far *) malloc (bloc)) == NULL)
{
puterrorlog (_Strings[L_Malloc65KError]);
close (fin);
close (fout);
return ERROR;
}
do {
if (taille < offset+bloc)
bloc = taille - offset;
/* si on arrive au bout, on lit seulement */
/* jusqu'à la fin. */
read (fin, ptr, bloc);
if (write (fout, ptr, bloc) == -1)
{
close (fin);
close (fout);
free (ptr);
return ERROR;
}
offset += bloc;
} while (taille != offset); /* fin do */
lseek(fin, 0,SEEK_SET);
locking (fin, LK_UNLCK, filelength (fin));
close (fin);
close (fout);
free (ptr);
return OK;
}
/*------------------------------------------------------------------------
* RENBAK : Renomme un fichier en .bak
*/
int renbak (char *file)
{
char filebak [255];
char *pointeur;
pointeur = strchr (file, '.');
if (pointeur != NULL)
{
*pointeur = 0;
sprintf (filebak, "%s.bak", file);
*pointeur = '.';
} else {
sprintf (filebak, "%s.bak", file);
}
remove (filebak);
return (rename (file, filebak));
}
/*------------------------------------------------------------------------
GETMAXAREA : retourne le nombre d'area de DIR.LST
*/
unsigned getmaxarea (void)
{
FILE *fin;
int i=0;
if ((fin = _fsopen (Config.DirList, "rb", SH_DENYNO)) == NULL)
{
puterrorlog (_Strings[L_CanNotOpenReadMode], Config.DirList);
return ERROR;
}
do {
i++;
if ( fgets (tampon, 97, fin) == NULL) break;
} while (1); /* fin do */
fclose (fin);
return (i);
}