Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <dirent.h>
- #include <unistd.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include <sys/stat.h>
- #define DIM_BUFFER 1024
- #define P 100
- typedef enum{
- CMD_LIST,
- CMD_SIZE,
- CMD_SEARCH,
- CMD_ERROR,
- RPL_DATA,
- RPL_DATA_STOP
- }cmd;
- typedef struct{
- long dest;
- char nome_file[DIM_BUFFER];
- char stringa[DIM_BUFFER];
- int dim;
- cmd comando;
- }message;
- void child(int msg, char *path, int num){
- message message;
- char buffer[DIM_BUFFER];
- int ricorrenze = 0;
- struct dirent *entry;
- struct stat statbuf;
- FILE *file;
- DIR *dir;
- while(1){
- msgrcv(msg, &message, sizeof(message) - sizeof(long), num, 0);
- switch(message.comando){
- case CMD_LIST:
- chdir(path);
- if((dir = opendir(path)) == NULL){
- perror("dir");
- exit(0);
- }
- while((entry = readdir(dir)) != NULL){
- lstat(entry->d_name, &statbuf);
- if(S_ISREG(statbuf.st_mode)){
- strcpy(message.nome_file, entry->d_name);
- message.comando = RPL_DATA;
- message.dest = P;
- msgsnd(msg, &message, sizeof(message) - sizeof(long), 0);
- }
- }
- message.comando = RPL_DATA_STOP;
- message.dest = P;
- msgsnd(msg, &message, sizeof(message) - sizeof(long), 0);
- break;
- case CMD_SIZE:
- chdir(path);
- lstat(message.nome_file, &statbuf);
- if(S_ISREG(statbuf.st_mode)){
- message.dest = P;
- message.dim = statbuf.st_size;
- message.comando = RPL_DATA;
- strcpy(message.nome_file, path);
- msgsnd(msg, &message, sizeof(message) - sizeof(long), 0);
- }
- break;
- case CMD_SEARCH:
- chdir(path);
- if((file = fopen(message.nome_file, "r")) == NULL){
- perror("file");
- exit(0);
- }
- while(fgets(buffer, DIM_BUFFER, file)){
- if (buffer[strlen(buffer)-1] == '\n')
- buffer[strlen(buffer)-1] = '\0';
- if(strcmp(buffer, message.stringa) == 0){
- ricorrenze++;
- }
- }
- message.dest = P;
- message.dim = ricorrenze;
- message.comando = RPL_DATA;
- msgsnd(msg, &message, sizeof(message) - sizeof(long), 0);
- break;
- default:
- break;
- }
- }
- }
- int main(int argc, char *argv[]){
- int msg, tok, len;
- int quit = 0;
- int child_ = 0;
- char *token;
- char buffer[DIM_BUFFER];
- message message;
- if((msg = msgget(IPC_PRIVATE, IPC_CREAT|0600)) == -1){
- perror("msg");
- exit(0);
- }
- for(int i = 1; i < argc; i++){
- child_++;
- if(fork() == 0){
- child(msg, argv[i], i);
- }
- }
- sleep(1);
- do{
- printf("file-shell> ");
- fgets(buffer, DIM_BUFFER, stdin);
- len = strlen(buffer);
- if (buffer[len-1] == '\n')
- buffer[len-1] = '\0';
- token = strtok(buffer, " ");
- if(strcmp(token, "list") == 0){
- message.comando = CMD_LIST;
- token = strtok(NULL, " ");
- tok = atoi(token);
- if(tok > child_ || tok < 0){
- printf("cartella non trovata! \n");
- }else{
- message.dest = tok;
- }
- msgsnd(msg, &message, sizeof(message) - sizeof(long), 0);
- while(1){
- msgrcv(msg, &message, sizeof(message) - sizeof(long), P, 0);
- if(message.comando == RPL_DATA){
- printf("file: %s \n", message.nome_file);
- }else if(message.comando == RPL_DATA_STOP){
- break;
- }
- }
- }else if(strcmp(token, "size") == 0){
- message.comando = CMD_SIZE;
- token = strtok(NULL, " ");
- tok = atoi(token);
- if(tok > child_ || tok < 0){
- printf("cartella non trovata! \n");
- }else{
- message.dest = tok;
- token = strtok(NULL, " ");
- strcpy(message.nome_file, token);
- }
- msgsnd(msg, &message, sizeof(message) - sizeof(long), 0);
- while(1){
- msgrcv(msg, &message, sizeof(message) - sizeof(long), P, 0);
- if(message.comando == RPL_DATA){
- printf("dimensione %s: %d \n", message.nome_file, message.dim);
- break;
- }
- }
- }else if(strcmp(token, "search") == 0){
- message.comando = CMD_SEARCH;
- token = strtok(NULL, " ");
- tok = atoi(token);
- if(tok > child_ || tok < 0){
- printf("cartella non trovata! \n");
- }else{
- message.dest = tok;
- token = strtok(NULL, " ");
- strcpy(message.nome_file, token);
- token = strtok(NULL, " ");
- strcpy(message.stringa, token);
- }
- msgsnd(msg, &message, sizeof(message) - sizeof(long), 0);
- while(1){
- msgrcv(msg, &message, sizeof(message) - sizeof(long), P, 0);
- if(message.comando == RPL_DATA){
- printf("ricorrenze: %d \n", message.dim);
- break;
- }
- }
- }else if(strcmp(token, "quit") == 0){
- quit = 1;
- }else{
- printf("comando errato! \n");
- }
- }while(quit == 0);
- exit(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement