Laborator 5

Citeste un fisier si un director. In acel director se vor cauta link-uri si fisiere normale. Daca...diverse conditii, afiseaza denumirea link-ului si calea spre care pointeaza, respectiv denumirea fisierului, si numarului de block-uri

#include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <limits.h> #include <errno.h> #include <dirent.h> #include <string.h> #include <unistd.h> void myErorr(char *msg){ fprintf(stderr,"%s:%s\n",msg,strerror(errno)); exit(errno); } void solve(int argc, char *argv[]){ if(argc!=3){ myErorr("3 arguments required"); } int fd; if( (fd=open(argv[1], O_WRONLY) ) <0){ myErorr("Error opening file"); } DIR *dir; struct dirent *indir; struct stat info; char cale[PATH_MAX]=""; char caleLink[PATH_MAX+1]=""; int n; if(! (dir=opendir(argv[2])) ){ myErorr("Error opening directory"); } errno=0; while( (indir=readdir(dir))!=NULL){ if(strcmp(indir->d_name,".")==0 || strcmp(indir->d_name,"..")==0){ continue; } strcpy(cale,argv[2]); strcat(cale,"/"); strcat(cale,indir->d_name); if(lstat(cale,&info)){ myErorr("Eroare la lstat"); } if( S_ISLNK(info.st_mode) ) { if(info.st_size>-5){ printf("Hello man!\n"); n=readlink(cale, caleLink, sizeof(caleLink)); caleLink[n]='\0'; char buf[2*PATH_MAX+30]; snprintf(buf, 2*PATH_MAX+30, "Denumire link:%s Cale link:%s ->",cale,caleLink); if(write(fd,buf, strlen(buf))<0){ myErorr("Error while writing to file"); } } }else{ if(S_ISREG(info.st_mode)){ printf("Hello world!\n"); if(info.st_blocks>-10){ char buf[PATH_MAX]=""; snprintf(buf, PATH_MAX, "File name:%s\n Number blocks:%ld\n",indir->d_name,info.st_blocks); if(write(fd,buf, strlen(buf))<0){ myErorr("Error while writing nrBlocks"); } } } } } if(errno){ myErorr("Error reading directory "); } if(closedir(dir)){ myErorr("Error closing directory"); } if(close(fd)){ myErorr("Error closing file"); } } int main(int argc, char *argv[]) { solve(argc, argv); return 0; }