From 3da12c53b57b300bc6489d2c904702c707b5cf30 Mon Sep 17 00:00:00 2001 From: "zmiguel.alves@gmail.com" Date: Sat, 23 Nov 2019 23:22:02 +0000 Subject: [PATCH] Meta 1 --- .vscode/launch.json | 29 +++++++++++++++++++++++++ .vscode/tasks.json | 25 ++++++++++++++++++++++ client | Bin 17536 -> 0 bytes client.c | 4 ++-- dec.h | 3 ++- server | Bin 18104 -> 0 bytes server.c | 51 +++++++++++++++++++++++++++++--------------- util.h | 12 ++++++----- verificador | Bin 17328 -> 0 bytes 9 files changed, 99 insertions(+), 25 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json delete mode 100644 client delete mode 100644 server delete mode 100644 verificador diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..05dd360 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,29 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "gcc-8 build and debug active file", + "type": "cppdbg", + "request": "launch", + "program": "/home/zmiguel/TP/${fileBasenameNoExtension}", + "args": [], + "stopAtEntry": false, + "cwd": "/home/zmiguel/TP", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "gcc-8 build active file", + "miDebuggerPath": "/usr/bin/gdb" + } + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..5cf0927 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,25 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "type": "shell", + "label": "gcc-8 build active file", + "command": "/usr/bin/gcc-8", + "args": [ + "-g", + "${file}", + "-o", + "/home/zmiguel/TP/${fileBasenameNoExtension}" + ], + "options": { + "cwd": "/usr/bin" + }, + "problemMatcher": [ + "$gcc" + ], + "group": "build" + } + ] +} \ No newline at end of file diff --git a/client b/client deleted file mode 100644 index f4930cfd5c485bc5ca404fc0b9ee4ce56599a19a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17536 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 jaNV`3B*)h)Zl_1c<+3gu;RY}bDi*u diff --git a/client.c b/client.c index 23f2504..fb54aa3 100644 --- a/client.c +++ b/client.c @@ -15,7 +15,7 @@ int main(int argc, char *argv[]){ int sair=0, test=-1; - char str[80], *palavra[10], *username[30]; + char str[80], *palavra[10], username[30]; int i; cl2sv msg2sv; @@ -111,7 +111,7 @@ int main(int argc, char *argv[]){ i = write(fd_servidor, &msg2sv, sizeof(msg2sv)); }else if(strcmp(palavra[0],"verifica")==0){ strcpy(msg2sv.cmd, "verifica"); - strcpy(msg2sv.opts,palavra[1]); + strcpy(msg2sv.opts, palavra[1]); /* ENVIAR PEDIDO PARA "CP" DO SERVIDOR (write) */ i = write(fd_servidor, &msg2sv, sizeof(msg2sv)); //ler resposta do servidor diff --git a/dec.h b/dec.h index 7e2982d..98c5c8a 100644 --- a/dec.h +++ b/dec.h @@ -6,4 +6,5 @@ char *getUsernameFromfifo(clients *users, char *fifo); void listusers(clients *users); void closeapp(int sig); void desligarClientes(clients *users); -clients *removeUser(clients *users, char *cp, int *nUsers); \ No newline at end of file +clients *removeUser(clients *users, char *cp, int *nUsers); +void verificador(char *verify); \ No newline at end of file diff --git a/server b/server deleted file mode 100644 index 9f67cd3e71daecdcb5cd98ed21f1798b6f0857de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18104 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 #include #include +#include +#include #include #include #include @@ -27,7 +29,7 @@ int main(int argc, char *argv[]){ int userCounter = 0; srand(time(NULL)); - int fd_servidor, fd_cliente, fd_child[2]; + int fd_servidor, fd_cliente; /* VERIFICAR SE EXISTE "CP" DO SERVIDOR (access) -- APENAS UM!!!*/ if(access("CPservidor", F_OK)==0){ printf("[SERVIDOR] Ja existe um servidor!\n"); @@ -93,21 +95,7 @@ int main(int argc, char *argv[]){ printf("[SERVER] Cliente removido!\n"); uinit = users; }else if(strcmp(clResp.cmd,"verifica")==0){ - printf("[SERVER] A verificar '%s'\n",clResp.opts); - pipe(fd_child); - switch(fork()){ - case 0://child - close(fd_child[1]); - dup2(fd_child[0], STDIN_FILENO); - close(fd_child[0]); - execl("verificador", "./verificador", "words.txt", NULL); - default://me - close(fd_child[0]); - write(fd_child[1], clResp.opts, sizeof(clResp.opts)); - close(fd_child[1]); - wait(NULL); - } - + verificador(clResp.opts); } }while(sair==0); @@ -168,7 +156,7 @@ clients *addUser(clients *users, int *nUsers, char *username, int pid, char *fif char *getUsernameFromfifo(clients *users, char *fifo){ clients *uinit = users; - char send[100]; + char *send = malloc(sizeof(char)*100); while(users!=NULL){ if(strcmp(users->fifostr,fifo)==0){ strcpy(send,users->nome); @@ -219,4 +207,33 @@ clients *removeUser(clients *users, char *cp, int *nUsers){ } } return uinit; +} + +void verificador(char *verify){ + int fd_child[2], estado; + + pipe(fd_child); + switch(fork()){ + case 0://child + /*close(fd_child[1]); + dup2(fd_child[0], STDIN_FILENO); + close(fd_child[0]);*/ + close(0); + dup(fd_child[0]); + close(fd_child[1]); + close(fd_child[0]); + execl("verificador", "./verificador", "words.txt", NULL); + break; + default://me + /*close(fd_child[0]); + write(fd_child[1], clResp.opts, sizeof(clResp.opts)); + close(fd_child[1]);*/ + close(1); + dup(fd_child[1]); + printf("%s\n",verify); + close(fd_child[0]); + close(fd_child[1]); + close(1); + wait(&estado); + } } \ No newline at end of file diff --git a/util.h b/util.h index f26af8f..4daa8b9 100644 --- a/util.h +++ b/util.h @@ -14,16 +14,18 @@ typedef struct st_mensagem{ int duracao; int time_added; - struct topic * topico; - struct mensagem * prox; + struct st_topic * topico; + struct st_mensagem * prox; }mensagem; typedef struct st_topic{ int id; char nome[TAM_NOME]; - struct mensagem * mensg; - struct topic * prox; + struct st_mensagem * mensg; + struct st_topic * prox; }topic; + + //guardar clientes typedef struct st_clients{ int pid; @@ -31,7 +33,7 @@ typedef struct st_clients{ char fifostr[TAM_NOME]; int topics[TAM_SUB]; - struct clients *prox; + struct st_clients *prox; }clients; //estructura dados de cliente --> servidor diff --git a/verificador b/verificador deleted file mode 100644 index adce2ee2c7a4663404e2fc62303e19647edba0ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17328 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 WT~?&&ibF+;u2`TnMmP){toRqynTh29