/* gccPj001_7.c */
/* = Kdo.c + gccPj001_5.c */
/* (2005-03-29) Now, I am getting into Kdo_0[1-5].c codes.
* The file pointer "Stream" is local within OpenAnyFile
* subroutine, and it is renamed in main.c as the file pointer "file".
*
*/
/* (2006-07-27, 2008-03-10) Three major paths are,
*
* PATH_1 = strcpy (DEFAULT_1, "/var/www/html");
* PATH_2 = strcpy (DEFAULT_2, "/var/www/html/htm");
* PATH_3 = strcpy (DEFAULT_3, "/var/www");
*
* For [PATH_1 Catalog], I included /html/htm as a
* special no recursive -R option, otherwise it will include about
* 10 [lc] language big sub-directories.
*/
/* (2008-03-10) There are also three Static_directories in the C-codes.
* below. You erase them or customize them.
*
* /home/mkido/1dual
* /home/mkido/admin_link
* /home/mkido/bin
*
*/
/* (2008-03-10) ATTENTION !!! While compiling this [gccPj001_7.c],
* you need to use the special Switch. That is about line number 80
* of this file, [ **** Compiling for SDW or NET *****].
*
* SDW switch makes 1Bat, 2Er, 3Diff for shadow server of silhouette.
* NET switch makes 1Bat, 2Er, 3Diff for main server on Internet.
*
* Only the 1Bat is different between shadow server and main server though.
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
char line [256];
char uType [16];
char linePATH_1 [256], linePATH_2 [256], linePATH_3 [256];
char linePATH_1Er [256], linePATH_2Er [256], lineDIFF [256];
/* Those above lines could be all 'line', but they are Global, so
* I took an extra cautious step to avoid any mixed-up.
*/
char folderName [128];
FILE *OpenAnyFile (char *FileName); /* Kdo's Subroutine */
void *strupr (void *buffer); /* Kdo's supplemental Subroutine */
extern char *spacedwd (char *to, char *from);
/* = spaced words, to capture blank-containing foldername */
/* Now is not OSX_Macintosh, so people won't type blank in a filename */
/* but I just leave as it was. */
main ()
{
char str0[64], str1[64], str2[64], str3[64];
char DEFAULT_1[64], DEFAULT_2[64], DEFAULT_3[64];
char MAGIC_SDW_NET[64];
char MAGIC_1[64], MAGIC_2[64], MAGIC_3[64];
char MAGIC_FN1[64], MAGIC_FN2[64], MAGIC_FN3[64];
int SW1, SW2, SW3;
// FILE *file;
FILE *infpPATH_1, *infpPATH_2, *infpPATH_3, *outfp1, *outfp2;
/* These Pointers read fileNames list */
SW1=SW2=SW3 = 0;
// ***** Compiling for SDW or NET *******
// strcpy (MAGIC_SDW_NET, "SDW");
strcpy (MAGIC_SDW_NET, "NET");
// Directories to scan
strcpy (DEFAULT_1, "/var/www/html");
strcpy (DEFAULT_2, "/var/www/html/htm");
strcpy (DEFAULT_3, "/var/www");
// Additional static directories
strcpy (MAGIC_1, "/home/mkido/1dual");
strcpy (MAGIC_2, "/home/mkido/admin_link");
strcpy (MAGIC_3, "/home/mkido/bin");
strcpy (MAGIC_FN1, "1dual");
strcpy (MAGIC_FN2, "admin_link");
strcpy (MAGIC_FN3, "bin");
outfp1=fopen("Batch.txt", "w");
/* outfp1 is for generic output Batch file. */
outfp2=fopen("header.txt", "w");
/* outfp2 makes integrated file, header_1.txt + header_2.txt + static_folder_names. */
/* First PATH_1 ============================================== */
infpPATH_1 = OpenAnyFile ("header_1.txt");
if (infpPATH_1) {
printf ("\nReading ..... Header_1.txt, Header_2.txt, \n");
printf ("Header_3.txt, automatically for 3 different PATHs ... \n");
} else {
// perror ("Open failed");
printf("!!!!! Please put a \"Header_1.txt\", \"Header_2.txt\", \n");
printf("!!!!! \"Header_3.txt\" files about your scanning folders \n");
printf("!!!!! information. Please refer to \"Intro.PDF\" about \n");
printf("!!!!! how to make it. And do this again. \n\n");
exit (0);
}
/***** This Block is out of place But COPY CAME UP HERE, ******/
/***** for early notice ******/
/***** of MISSING "Header.txt" file. ******/
/*****************************************************************/
/* ************ HERE COMES IMPORT << gccpj001.c *************** */
/* ***** main()'s codes' basic structure above is Kdo's ******* */
// main()
// {
printf("\n\nThis Linux Server DUAL is modified from local DUAL \n");
printf("(ZIP/FLASH <=> Hard disk). This Linux Server DUAL \n");
printf("compares two machines. One Linux Server is running on \n");
printf("the Internet, while the other shadow Linux Server \n");
printf("(silhouette) stays out of the Internet. Only when \n");
printf("the main Server machine downs, the shadow Linux Server \n");
printf("will take place the main server's post. \n");
printf("The 100 percent same content in two machines is desirable. \n");
printf("Please customize it which works for you. This is just \n");
printf("good for me now. \n\n");
/* Read user's input from the standard input */
/* The following User's Magic Variable Inputs work pretty well */
printf("The following asks you three main PATHs of scanning, and \n");
printf("automatically appending three static directory without asking. \n");
printf("They works for me now. You must customize them for your \n");
printf("servers in C-codes level. Very easy! \n\n");
printf("\nType your working folder name in which you runs this DUAL. \n");
printf(" I usually make \"1dual\" folder at my home. \n");
printf(" For example: 1dual : ");
scanf("%s", &str0);
printf("Your Working Folder is set to : %s\n\n\n\n", str0);
/* ---------------------------------------------- */
printf("Default OR another scanning path for PATH_1 ? \n");
printf(" Please select the switch. \n");
printf(" 1. Default /var/www/html for PATH_1. \n");
printf(" 2. Type different path. \n");
printf(" Select the switch [1 or 2] : ");
scanf("%d", &SW1);
if (SW1==1) { strcpy (str1, DEFAULT_1); }
else if (SW1==2) {
printf(" For example: /home/mkido/Brasil/Rio_de_Janeiro \n");
printf(" Type now : ");
scanf("%s", &str1);
}
printf("Scanning PATH_1 is set to : %s\n\n", str1);
/* ---------------------------------------------- */
printf("Default OR another scanning path for PATH_2 ? \n");
printf(" Please select the switch. \n");
printf(" 1. Default /var/www/html/htm for PATH_2. \n");
printf(" 2. Type different path. \n");
printf(" Select the switch [1 or 2] : ");
scanf("%d", &SW2);
if (SW2==1) { strcpy (str2, DEFAULT_2); }
else if (SW2==2) {
printf(" For example: /home/mkido/Brasil/Sao_Paulo \n");
printf(" Type now : ");
scanf("%s", &str2);
}
printf("Scanning PATH_2 is set to : %s\n\n", str2);
/* ---------------------------------------------- */
printf("Default OR another scanning path for PATH_3 ? \n");
printf(" Please select the switch. \n");
printf(" 1. Default /var/www/ for PATH_3. \n");
printf(" 2. Type different path. \n");
printf(" Select the switch [1 or 2] : ");
scanf("%d", &SW3);
if (SW3==1) { strcpy (str3, DEFAULT_3); }
else if (SW3==2) {
printf(" For example : /home/mkido/Bolivia/Santa_Cruz_de_la_Sierra \n");
printf(" Type now : ");
scanf("%s", &str3);
}
printf("Scanning PATH_3 is set to : %s\n\n", str3);
/* ---------------------------------------------- */
/* Finished user's input. Now, get started an output. */
fprintf (outfp1, "#! /bin/tcsh\n");
fprintf (outfp1, "#! /bin/bash\n\n");
if( strncmp ("SDW", MAGIC_SDW_NET, 3) == 0 ){
fprintf (outfp1, "mkdir SDW\n");
fprintf (outfp1, "mkdir SDW/Erased\n");
fprintf (outfp1, "mkdir DIFF\n\n");
}
if( strncmp ("NET", MAGIC_SDW_NET, 3) == 0 ){
fprintf (outfp1, "mkdir NET\n");
fprintf (outfp1, "mkdir NET/Erased\n");
}
fprintf (outfp1, "\n"); /* One Spacer line before we get started a catalog command line. */
/* Read all foldernames listing in "HEADER" file */
/* I added, if( infp=fopen() != NULL ) in case an user forgets the "Header"
* file. Since I myself forget it often, I am making sure that the file
* is provided. I wanted to put this message all the way first, so
* this went up.
*/
/******** Here is the ORIGINAL LOCATION of the notice **********/
/******** about MISSING "Header OR Header.txt" file. *********/
// if ( (infpPATH_1=fopen("Header", "r"))!= NULL) ;
// else if ( (infpPATH_1=fopen("Header.Txt", "r"))!= NULL) ;
// else{
// printf("!!!!! Please put a \"Header\" file about your Folder information.\n");
// printf("!!!!! And do this again.\n");
// exit (0);
// }
/*===== Making PATH_1 Catalog =====*/
while( (fgets(linePATH_1, 64, infpPATH_1))!=NULL )
{
spacedwd (folderName, &linePATH_1[0]); /* Opening foldername, one-by-one */
fprintf (outfp1, "cd %s/\"%s\"\n", str1, folderName);
/* The if-loop below is a special handling, not to have R-RECURSIVE */
if( strcmp("htm", folderName)==0 ){
fprintf (outfp1, "ls -lF > ~/%s/%s/\"%s.txt\"\n", str0, MAGIC_SDW_NET, folderName);
}else{
fprintf (outfp1, "ls -lFR > ~/%s/%s/\"%s.txt\"\n", str0, MAGIC_SDW_NET, folderName);
}
fprintf (outfp2, "%s\n", folderName); /* Extra, writing header.txt */
} /* closing While-loop */
fclose (infpPATH_1);
*folderName=0; /* Reset, in case */
fprintf (outfp1, "\n"); /* One Spacer line to see PATH_1, PATH_2 command lines clearly */
/* Second PATH_2 ======================================================= */
/* Reading Header2.txt. */
infpPATH_2 = OpenAnyFile ("header_2.txt");
if (infpPATH_2)
printf (" \n");
else exit (0);
/*===== Making PATH_2 Catalog =====*/
while( (fgets(linePATH_2, 64, infpPATH_2))!=NULL )
{
spacedwd (folderName, &linePATH_2[0]); /* Opening foldername, one-by-one */
fprintf (outfp1, "cd %s/\"%s\"\n", str2, folderName);
fprintf (outfp1, "ls -lFR > ~/%s/%s/\"%s.txt\"\n", str0, MAGIC_SDW_NET, folderName);
fprintf (outfp2, "%s\n", folderName); /* Extra, writing header.txt */
} /* closing While-loop */
fclose (infpPATH_2);
*folderName=0; /* Reset, in case */
fprintf (outfp1, "\n"); /* One Spacer line to see PATH_2, PATH_3 command lines clearly */
/* Second PATH_3 =============================================================== */
/* Reading Header3.txt. */
infpPATH_3 = OpenAnyFile ("header_3.txt");
if (infpPATH_3)
printf (" \n");
else exit (0);
/*===== Making PATH_3 Catalog =====*/
while( (fgets(linePATH_3, 64, infpPATH_3))!=NULL )
{
spacedwd (folderName, &linePATH_3[0]); /* Opening foldername, one-by-one */
fprintf (outfp1, "cd %s/\"%s\"\n", str3, folderName);
fprintf (outfp1, "ls -lFR > ~/%s/%s/\"%s.txt\"\n", str0, MAGIC_SDW_NET, folderName);
fprintf (outfp2, "%s\n", folderName); /* Extra, writing header.txt */
} /* closing While-loop */
fclose (infpPATH_3);
*folderName=0; /* Reset, in case */
/*===== PATH_MAGIC_STATIC-Catalog =====*/
fprintf (outfp1, "\n");
fprintf (outfp1, "cd %s\n", MAGIC_1);
fprintf (outfp1, "ls -lFR > ~/%s/%s/%s.txt\n", str0, MAGIC_SDW_NET, MAGIC_FN1);
fprintf (outfp1, "cd %s\n", MAGIC_2);
fprintf (outfp1, "ls -lFR > ~/%s/%s/%s.txt\n", str0, MAGIC_SDW_NET, MAGIC_FN2);
fprintf (outfp1, "cd %s\n", MAGIC_3);
fprintf (outfp1, "ls -lFR > ~/%s/%s/%s.txt\n", str0, MAGIC_SDW_NET, MAGIC_FN3);
/* Extra, writing header.txt */
fprintf (outfp2, "%s\n", MAGIC_FN1);
fprintf (outfp2, "%s\n", MAGIC_FN2);
fprintf (outfp2, "%s\n", MAGIC_FN3);
/* This message is moved down, because it prompts to look at Batch file which
* is empty, if this message is up before while-loop.
*/
printf("\n\n\nPlease examine \"Batch.txt\" file in this working folder after you \n");
printf("will finish this \"1Bat\". You will see something like below. \n\n");
printf("#! /bin/tcsh \n");
printf("#! /bin/bash \n\n");
printf("mkdir SDW \n");
printf("mkdir SDW/Erased \n");
printf("mkdir DIFF \n\n");
printf("cd /var/www/html/Escolas_de_Samba/\"Aguia_de_Ouro\" \n");
printf("ls -lFR > ~/1dual/SDW/\"Aguia_de_Ouro\" \n");
printf("cd /var/www/html/Escolas_de_Samba/\"Mocidade_Alegre\" \n");
printf("ls -lFR > ~/1dual/SDW/\"Mocidade_Alegre\" \n\n");
printf("Assuming your computer has all set of Samba schools\' folder name, you \n");
printf("would see like these lines. We are ready to run this Batch script file. \n");
printf("Please read carefully how to run this UNIX/Linux/MacOSX generic \n");
printf("Batch Shell scripts at \"Unix_Linux_MacOSX.PDF\". -> \"How to set \n");
printf("\'Batch.txt\' as an executable file.\" \n\n\n");
printf("Type any key then [return] to read through this note : ");
scanf( "%s", &uType);
printf("\n\n\nIf your Batch file is messy, a likely problem is that \n");
printf("\"Header.txt\" file, so read carefully about trouble shooting \n");
printf("about \"Header.txt\" file at the trouble shooting in \n");
printf("\"Unix_Linux_MacOSX.PDF\". \n");
printf("If your Batch file has the wrong Path, or missing \n");
printf("parental Path etc., you can run this \"1Bat\" again, OR \n");
printf("edit the \'Batch.txt\' by your favorite Unix_Linux Editor. \n");
printf("\"Replace ALL\" works conveniently to fix the Paths. \n\n");
printf("By a brief test, you may need to Re-new the Executable \n");
printf("Path before running the Batch file. \n");
printf("Don\'t forget to change the Batch file permission from \n");
printf("Read only mode to Read and Executable mode, such as \'chmod 777\'. \n\n");
/* This message is about right time, but until running the Batch file,
* I can't say
* "Please check whether folders are made".
*/
printf("When you will successfully run the Batch script, you should be able \n");
printf("to see \"SDW\" and \"DIFF\" folders at Shadow Linux server, and \"NET\" \n");
printf("at Main Linux Server on Internet. You need to do file transfer (FTP) the \n");
printf("entire \"NET\" folder into Shadow server, or file transfer \"SDW\" and \n");
printf("\"DIFF\" folders to Main Server on Internet. It doesn't matter. We just \n");
printf("need a set of 3 folders at one place before running the final two steps. \n");
printf("And those two folders (\"SDW\" or \"NET\") are filled with catalogs, \n");
printf("which have all content information of each scanning folder. \n");
printf("If you will see them, then we can go to the final easy two steps. \n\n\n");
printf("END of \"1Bat\" \n\n");
fclose (outfp1);
fclose (outfp2);
}
/* ************* HERE ENDS IMPORT **************** */
/* Here are two SUBROUTINEs by Kdo. */
/* ******************************** */
// FILE *OpenAnyFile (char *FileName);
// void *strupr (void *buffer);
/* Find any file with same spelling regardless of capitalization */
/* Return a stream to the file, opened for read access */
FILE *OpenAnyFile (char *FileName)
{
DIR *Dir;
struct dirent *DirEnt;
char *Target;
char *Temp;
FILE *Stream = NULL;
Target = strdup (FileName); // make an upper case version of the name.
strupr (Target);
Dir = opendir ("."); /* any suitable directory name */
while (DirEnt = readdir (Dir))
{
Temp = strdup (DirEnt->d_name);
strupr (Temp); // convert the found name to upper case
if (strcmp (Temp, Target) == 0) // names match
{
Stream = fopen (DirEnt->d_name, "r"); // open the file for read
free (Temp);
break;
}
free (Temp);
}
free (Target);
closedir (Dir);
return (Stream);
}
/* strupr() isn't universal. You can make one very easily. */
/* Pass void so you can pass either char or unsigned char */
/* void *strupr (void *buffer); */
void *strupr (void *Buffer)
{
unsigned char *ptr;
ptr = (unsigned char *)Buffer;
while (*ptr)
{
if (*ptr >= 'a' && *ptr <= 'z')
*(ptr++) = (*ptr) - 'a' + 'A';
else
ptr++;
}
return (Buffer);
}