Laborator 6

Test..

Sa se scrie un program in C ce utilizeaza apeluri de sistem si functii de biblioteca si se apeleaza in felul urmator: newls directoryName sau newls. In cazul lipsei numelui directorului, se considera directorul curent. Se considera fisierul de output, log.txt care este creat in momentul rularii programului. Daca fisierul este deja creat, programul se va termina imediat. Se vor parcurge intrarile directorului in mod nerecursiv si se va scrie in fisierul log.txt urmatoarele:

In cazul unui director se va scrie: "Director: <rwx>(drepturile de read, write, execution pentru owner) cale director"

In cazul unui fisier regular se va scrie: "Fisier reg: <rwx> digitCount marimeFisier calea" ...unde digitCount reprezinta numarul de cifre din fisier

In cazul unei legaturi simbolice se va scrie: "Legatura simbolica: caleLegatura marimea target-ului.

Se vor verifica toate cazurile de eroare pentru apelurile de sistem si se vor afisa mesaje specifice, urmate de terminarea executiei programului. Dintre functiile de biblioteca,se pot utiliza cele pentru parcurgerea directoarelor si cele care opereaza asupra caracterelor sau a sirurilor de caractere.

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

#include <dirent.h>

#include <sys/errno.h>

#include <errno.h>

#include <sys/sysmacros.h>

#include <limits.h>

#include <linux/limits.h>

#include <fcntl.h>

#include <ctype.h>

void myError(char* msg){

fprintf(stderr," %s: %s\n",msg,strerror(errno));

exit(errno);

}

void solve2(){

solve(".");

}

void solve(char* path){

DIR *dir;

struct dirent *indir;

struct stat info;

char cale[PATH_MAX];

char caleLink[PATH_MAX+1];

char buff[2*PATH_MAX+30];

if( (dir=opendir(path))==NULL){

myError("Error while openning directory");

}

int fd;

char name[]="log.txt";

if( (fd=open(name,O_WRONLY|O_CREAT|O_EXCL,S_IRWXU)==-1)){

myError("Error while openning output file");

}

errno=0;

while((indir=readdir(dir))!=NULL){

if(strcmp(indir->d_name,".")==0 || strcmp(indir->d_name,"..")==0){

continue;

}

snprintf(cale,PATH_MAX,"%s/%s",path,indir->d_name);

if(lstat(cale,&info)){

myError("Eroare la lstat");

}

if(S_ISDIR(info.st_mode)){

char rights[3];

if(info.st_mode&S_IRUSR){

rights[0]='r';

}else{

rights[0]='-';

}

if(info.st_mode&S_IWUSR){

rights[1]='w';

}else{

rights[1]='-';

}

if(info.st_mode&S_IXUSR){

rights[2]='x';

}else{

rights[2]='-';

}

snprintf(buff,2*PATH_MAX+30,"Director: %s %s\n",rights,cale);

if( (write(fd,buff,2*PATH_MAX+30))==-1){

myError("Error while writing directory stuff to file");

}

}

if(S_ISREG(info.st_mode)){

char rights[3]="";

if(info.st_mode&S_IRUSR){

rights[0]='r';

}else{

rights[0]='-';

}

if(info.st_mode&S_IWUSR){

rights[1]='w';

}else{

rights[1]='-';

}

if(info.st_mode&S_IXUSR){

rights[2]='x';

}else{

rights[2]='-';

}

int digits=0;

char tmp[PATH_MAX];

int fd2;

if( (fd2=open(indir->d_name,O_RDONLY)==-1)){

myError("Error while openning input file");

}

int n;

while((n=read(fd2,tmp,PATH_MAX))){

for(int i=0;i<n;i++){

if(isdigit(tmp[i])){

digits++;

}

}

}

if(n==-1){

myError("Error while reading from file");

}

snprintf(buff,2*PATH_MAX+30,"Fisier reg: %s %d %ld %s \n",rights,digits,info.st_size,cale);

if( (write(fd,buff,2*PATH_MAX+30))==-1){

myError("Error while writing directory stuff to file");

}

}

if(S_ISLNK(info.st_mode)){

int n;

if((n=readlink(indir->d_name,caleLink,PATH_MAX+1))==-1){

myError("Error while trying to find path of link");

}

snprintf(buff,2*PATH_MAX+30,"Legatura simbolica: %s %ld\n",caleLink,info.st_size);

if( (write(fd,buff,2*PATH_MAX+30))==-1){

myError("Error while writing directory stuff to file");

}

}

}

if(errno!=0){

myError("Error while reading directory");

}

if(closedir(dir)){

myError("Error while closing directory");

}

if(close(fd)){

myError("Error while closing output file");

}

}

int main(int argc, char* argv[]){

if(argc==2){

solve(argv[1]);

}else{

solve2();

}

}