Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.15 KB | None | 0 0
  1. #include"myFunc.c"
  2. int mode(struct stat info); //funkcja zwraca wartosc ktora reprezentuje rodzaj: 1-folder, 0-plik, - 1 inne
  3. void slept(int sig); //funkcja dla wywołania sygnału SIGALRM
  4. void heard(int sig); //funkcja dla wywołania sygnału SIGUSR1
  5. int if_Dir(char* path); //sprawdza, czy dana ścieżka jest katalogiem
  6. int copy(char *source, char *target); //funkcja kopiujaca pliki
  7. int copy_mmap(char *source, char *target, struct stat *st);//funkcja kopiująca pliki poprzez
  8. mapowanie
  9. int synchronize(char *src, char *dst, int rec, long int size);//funkcja synchronizuje podkatalogi
  10. void deleteExtras(char *src, char *dst, int rec);//funkcja usuwa zbędne foldery z katalogu docelowego
  11. Właściwy kod
  12. #include <stdlib.h>
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <ctype.h>
  16. #include <sys/stat.h>
  17. #include <errno.h>
  18. #include <sys/types.h>
  19. #include <dirent.h>
  20. #include <syslog.h>
  21. #include <signal.h>
  22. #include <sys/mman.h>
  23. #include <fcntl.h>
  24. #include <unistd.h>
  25. #include"myFunc.h"
  26. #define BUFSIZE 1024
  27. int snap = 300; //długość drzemki demona
  28. int main(int argc,char* argv[])
  29. {
  30.  sigset_t iset, iset2;
  31.  struct sigaction sleeper;
  32.  struct sigaction listener;
  33.  int pid, i,j,rec;
  34.  long int size;
  35.  int flag = 1;
  36.  rec=0;
  37.  size=100000;
  38.  openlog("moj_demon", LOG_PID, LOG_LOCAL1);
  39. // SPRAWDZENIE POPRAWNOŚCI PARAMETRÓW FUNKCJI
  40.  if (( argc < 3 ) || ( argc > 6 )) //sprawdzenie czy uzytkownik podal wlasciwa liczbe parametrow funkcji
  41.  {
  42.  syslog(LOG_ERR,"niewłasciwe wywolanie funkcji");
  43.  exit(1);
  44.  }
  45.  else if (access(argv[1],0) == -1) //sprawdzenie czy istnieje dostęp do podanej przez uzytkownika sciezki
  46.  {
  47.  syslog(LOG_ERR,"Sciezka1 - '%s' - nie istnieje\n",argv[1]);
  48.  exit(1);
  49.  }
  50.  else if (access(argv[2],0) == -1) //sprawdzenie czy istnieje dostęp do podanej przez uzytkownika sciezki
  51.  {
  52.  syslog(LOG_ERR,"Sciezka1 - '%s' - nie istnieje\n",argv[2]);
  53.  exit(1);
  54.  }
  55.  else if ((if_Dir(argv[1])) != 1) //sprawdzenie czy podana ścieżka jest katalogiem
  56.  {
  57.  syslog(LOG_ERR,"Sciezka1 - '%s' - nie jest katalogiem\n",argv[1]);
  58.  exit(1);
  59.  }
  60.  else if ((if_Dir(argv[2])) != 1) //sprawdzenie czy podana ścieżka jest katalogiem
  61.  {
  62.  syslog(LOG_ERR,"Sciezka1 - '%s' - nie jest katalogiem\n",argv[2]);
  63.  exit(1);
  64.  }
  65. // SPRAWDZENIE CZY UŻYTKOWNIK UŻYŁ DODATKOWYCH PARAMETRÓW FUNKCJI
  66.  if (argc > 3)
  67.  {
  68.  for (i=3; i < argc; i++)
  69.  {
  70.  switch (i)
  71.  {
  72.  case 3: //parametr okresla czy stosujemy rekurencyjną synchronizacje katalogów
  73.  if ((argv[i][0] == '-') || (argv[i][1] == 'R')) rec = 1;
  74.  break;
  75.  case 4: //parametr określa długość drzemki demona
  76.  for (j=0; j < strlen(argv[i]); ++j)
  77.  {
  78.  if (!(isdigit(argv[i][j])))
  79. {
  80.  flag = 0;
  81.  }
  82.  }
  83. if (flag=1) snap = atoi(argv[i]);
  84.  break;
  85.  case 5: //parametr określa graniczny rozmiar pliku przy którym zmieniamy metode kopiowania
  86.  flag = 1;
  87.  for (j=0; j < strlen(argv[i]); ++j)
  88.  {
  89.  if (!(isdigit(argv[i][j])))
  90. {
  91.  flag = 0;
  92.  }
  93.  }
  94. if (flag=1) size = atoi(argv[i]);
  95.  break;
  96.  default: break;
  97.  }
  98.  }
  99.  }
  100.  while(1 == 1)
  101.  {
  102.  sigemptyset(&iset);
  103.  sigemptyset(&iset2);
  104.  sleeper.sa_handler = &slept;
  105.  sleeper.sa_mask = iset;
  106.  sleeper.sa_flags = 0;
  107.  sigaction(SIGALRM, &sleeper, NULL);
  108.  listener.sa_handler = &heard;
  109.  listener.sa_mask = iset2;
  110.  listener.sa_flags = 0;
  111.  sigaction(SIGUSR1, &listener, NULL);
  112.  syslog(LOG_INFO,"demon śpi");
  113.  alarm(snap);
  114.  pause();
  115.  syslog(LOG_INFO,"demon budzi sie");
  116.  synchronize(argv[1], argv[2],rec,size);
  117.  deleteExtras(argv[1], argv[2],rec);
  118.  }
  119. closelog ();
  120. return 0;
  121. }
  122.  
  123. int mode(struct stat info)
  124. {
  125.  if(S_ISDIR(info.st_mode)) return 1;
  126.  else
  127.  if(S_ISREG(info.st_mode)) return 0;
  128.  else return -1;
  129. }
  130. void slept(int sig)
  131. {
  132.  syslog(LOG_INFO,"demon zbudził się z drzemki");
  133. }
  134. void heard(int sig)
  135. {
  136.  syslog(LOG_INFO,"demon został zbudzony sygnałem SIGUSR1");
  137. }
  138. /********************* Funcja sprawdza czy podana ściażka jest katalogiem *****************************/
  139. int if_Dir(char* path)
  140. {
  141.  struct stat info;
  142.  
  143.  if((stat(path, &info)) < 0) //jeśli nie udało się pobranie informacji o ścieżce, zwracana jest wartość -1
  144.  {
  145.  syslog(LOG_ERR,"nieudane pobranie informacji o pliku\n");
  146.  return -1;
  147.  }
  148.  else return mode(info);
  149. }
  150. /************************************************************************************************/
  151. /******************************FUNKCJA KOPIUJĄCA PLIKI*********************************************/
  152. int copy(char *source, char *target)
  153. {
  154.  int zrodlowy, docelowy, przeczytanych;
  155.  char buf[BUFSIZE];
  156.  zrodlowy = open(source, O_RDONLY);
  157.  docelowy = open(target, O_WRONLY | O_CREAT | O_TRUNC, 0777);
  158.  syslog(LOG_INFO,"plik z %s został skopiowany do %s",source,target);
  159.  do
  160.  {
  161.  przeczytanych = read(zrodlowy, buf, BUFSIZE);
  162.  if((write(docelowy, buf, przeczytanych)) < 0)
  163.  {
  164.  syslog(LOG_ERR,"nieudane zapisanie do pliku");
  165.  return -1;
  166.  }
  167.  }while(przeczytanych);
  168.  close(zrodlowy);
  169.  close(docelowy);
  170.  return 0;
  171. }
  172. /************************************************************************************************/
  173. /**********************FUNKCJA KOPIUJĄCA PLIKI POPRZEZ MAPOWANIE**********************************/
  174. int copy_mmap(char *source, char *target, struct stat *st)
  175. {
  176.  int zrodlowy, docelowy;
  177.  char* buf;
  178.  zrodlowy = open(source, O_RDONLY);
  179.  docelowy = open(target, O_WRONLY | O_CREAT | O_TRUNC, 0777);
  180.  syslog(LOG_INFO,"plik z %s został skopiowany do %s stosując metode mapowania",source,target);
  181.  buf = mmap(0,st->st_size,PROT_READ, MAP_SHARED, zrodlowy, 0);
  182.  if((write(docelowy, buf, st->st_size)) < 0)
  183.  {
  184.  syslog(LOG_ERR,"nieudane zapisanie do pliku");
  185.  return -1;
  186.  }
  187.  close(zrodlowy);
  188.  close(docelowy);
  189.  return 0;
  190. }
  191. /************************************************************************************************/
  192. /***********************FUNKCJA SYNCHRONIZUJĄCA KATALOGI****************************************/
  193. int synchronize(char *src, char *dst, int rec, long int size)
  194. {
  195.  DIR *catSrc;
  196.  DIR *catDst;
  197.  struct dirent *dit;
  198.  char srcpath[30];
  199.  char dstpath[30];
  200.  struct stat srcfileinfo;
  201.  struct stat dstfileinfo;
  202.  if (((catSrc = opendir(src)) == NULL) || ((catDst = opendir(dst)) == NULL))
  203.  {
  204.  syslog(LOG_ERR,"Blad otwarcia katalogu\n");
  205.  return -1;
  206.  }
  207.  syslog(LOG_INFO,"demon synchronizuje dwa katalogi %s %s",src,dst);
  208.  while ((dit = readdir(catSrc)) != NULL)
  209.  {
  210.  if( (strcmp(dit->d_name,".")==0) || (strcmp(dit->d_name,"..")==0) ) continue;
  211.  dstfileinfo.st_mtime = 0;
  212.  strcpy(srcpath,src);
  213.  strcpy(dstpath,dst);
  214.  strcat(srcpath,"/");
  215.  strcat(srcpath,dit->d_name);
  216.  strcat(dstpath,"/");
  217.  strcat(dstpath,dit->d_name);
  218.  stat(srcpath,&srcfileinfo);
  219.  stat(dstpath,&dstfileinfo);
  220.  switch (mode(srcfileinfo)) //sprawdzamy czym jest ścieżka
  221.  {
  222.  case 0: //jeśli ścieżka jest zwykłym plikiem
  223.  if(srcfileinfo.st_mtime > dstfileinfo.st_mtime) //jeśli data modyfikacji pliku w katalogu źródłowym jest późniejsza
  224.  {
  225.  if (srcfileinfo.st_size > size) //jeśli rozmiar pliku przekracza zadany rozmiar
  226.  copy_mmap(srcpath,dstpath,&srcfileinfo); //kopiowanie przez mapowanie
  227.  else copy(srcpath,dstpath); //zwykłe kopiowanie
  228.  }
  229. i++;
  230. break;
  231.  case 1: //jesli ścieżka jest folderem
  232.  if (rec == 1) //jeśli użytkownik wybral rekurencyjną synchronizacje
  233.  {
  234.  if (stat(dstpath,&dstfileinfo) == -1) //jeśli w katalogu docelowym brak folderu z katalogu źródłowego
  235.  {
  236.  mkdir(dstpath,srcfileinfo.st_mode); //utworz w katalogu docelowym folder
  237. synchronize(srcpath,dstpath,rec,size); //przekopiuj do niego pliki z folderu z katalogu źródłowego
  238.  }
  239. else synchronize(srcpath,dstpath,rec,size);
  240.  }
  241. break;
  242.  default: break;
  243.  }
  244.  }
  245.  syslog(LOG_INFO,"readdir() found a total of %i files", i);
  246.  closedir(catDst);
  247.  closedir(catSrc);
  248.  free(dit);
  249.  return 0;
  250. }
  251. /************************************************************************************************/
  252. /*****FUNCKCJA USUWA PLIKI Z KATALOGU DOCELOWEGO JEŚLI NIE MA GO W KATALOGU ŹRÓDŁOWYM***********/
  253. void deleteExtras(char *src, char *dst, int rec)
  254. {
  255.  DIR *catSrc;
  256.  DIR *catDst;
  257.  struct dirent *dit;
  258.  char srcpath[30];
  259.  char dstpath[30];
  260.  struct stat srcfileinfo;
  261.  struct stat dstfileinfo;
  262.  
  263.  dit=malloc(sizeof(struct dirent));
  264.  
  265.  if (((catDst = opendir(dst)) == NULL))
  266.  {
  267.  syslog(LOG_ERR,"Blad otwarcia katalogu\n");
  268.  }
  269.  while((dit = readdir(catDst))!=NULL)
  270.  {
  271.  if( (strcmp(dit->d_name,".")==0) || (strcmp(dit->d_name,"..")==0) ) continue;
  272.  strcpy(srcpath,src);
  273.  strcat(srcpath,"/");
  274.  strcat(srcpath,dit->d_name);
  275.  strcpy(dstpath,dst);
  276.  strcat(dstpath,"/");
  277.  strcat(dstpath,dit->d_name);
  278.  lstat(dstpath,&dstfileinfo);
  279.  if(mode(dstfileinfo) == 0)//regularny plik
  280.  {
  281.  if(lstat(srcpath,&srcfileinfo)==0) //istnieje taki plik w docelowym
  282.  {
  283.  if(mode(srcfileinfo) != 0)//jezeli nie jest regularnym plikiem
  284.  unlink(dstpath);
  285. syslog(LOG_INFO,"plik %s został usuniety",dstpath);
  286.  }
  287.  else//nie ma takiego pliku w docelowym
  288.  {
  289.  unlink(dstpath);
  290. syslog(LOG_INFO,"plik %s został usuniety",dstpath);
  291.  }
  292.  }
  293.  if(mode(dstfileinfo) == 1 && rec)//katalog i oprcja -R
  294.  {
  295.  if(lstat(srcpath,&srcfileinfo)==0) // istnieje taki katalog
  296.  {
  297.  if(mode(srcfileinfo) == 1)//katalog
  298.  deleteExtras(srcpath, dstpath,rec);
  299.  }
  300.  else//nie ma takiego katalogu
  301.  {
  302.  deleteExtras(srcpath, dstpath,rec);
  303. rmdir(dstpath);
  304.  }
  305.  }
  306.  }
  307.  closedir(catDst);
  308.  free(dit);
  309. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement