Added first functionality to client

This commit is contained in:
elvis
2022-04-16 21:21:04 +02:00
parent 68d3051c4f
commit 6eb723ce6b
4 changed files with 321 additions and 22 deletions

View File

@ -1,28 +1,29 @@
CC = gcc CC = gcc
CFLAGS += -std=c99 -Wall -Werror -pedantic -g CFLAGS += -std=c99 -Wall -Werror -pedantic -g
INCDIR = ./lib/utils ./lib/ini ./lib/threadpool ./src ./lib/log INCDIR = ./lib/utils ./lib/ini ./lib/threadpool ./src ./lib/log ./lib/api
INCLUDES := $(patsubst %,-I %,$(INCDIR)) INCLUDES := $(patsubst %,-I %,$(INCDIR))
LDFLAGS = -L . LDFLAGS = -L .
OPTFLAGS = #-O3 OPTFLAGS = #-O3
LIBS = -lpthread LIBS = -lpthread
SOCKET = ./cs_sock SOCKET = ./cs_sock
BUILD_DIR = ./build BUILD_DIR = ./build
SRC_DIR = ./src SRC_DIR = ./src
LIB_DIR = ./lib LIB_DIR = ./lib
OBJ_DIR = ./obj OBJ_DIR = ./obj
OBJ_SRC_SERVER := $(addprefix $(OBJ_DIR)/,$(patsubst %.c,%.o,$(notdir $(wildcard $(SRC_DIR)/server*.c)))) OBJ_SRC_SERVER := $(addprefix $(OBJ_DIR)/,$(patsubst %.c,%.o,$(notdir $(wildcard $(SRC_DIR)/server*.c))))
OBJ_SRC_CLIENT := $(addprefix $(OBJ_DIR)/,$(patsubst %.c,%.o,$(notdir $(wildcard $(SRC_DIR)/client*.c)))) OBJ_SRC_CLIENT := $(addprefix $(OBJ_DIR)/,$(patsubst %.c,%.o,$(notdir $(wildcard $(SRC_DIR)/client*.c))))
OBJ_LIBS := $(addprefix $(OBJ_DIR)/,$(patsubst %.c,%.o,$(notdir $(wildcard $(LIB_DIR)/*/*.c)))) OBJ_LIBS_SERVER := $(addprefix $(OBJ_DIR)/,$(patsubst %.c,%.o,$(notdir $(filter-out $(wildcard $(LIB_DIR)/api/*.c),$(wildcard $(LIB_DIR)/*/*.c)))))
OBJ_LIBS_CLIENT := $(addprefix $(OBJ_DIR)/,$(patsubst %.c,%.o,$(notdir $(filter-out $(wildcard $(LIB_DIR)/threadpool/*.c) $(wildcard $(LIB_DIR)/log/*.c),$(wildcard $(LIB_DIR)/*/*.c)))))
OBJ_SERVER := $(OBJ_SRC_SERVER) $(OBJ_LIBS) OBJ_SERVER := $(OBJ_SRC_SERVER) $(OBJ_LIBS_SERVER)
OBJ_CLIENT := $(OBJ_SRC_CLIENT) $(OBJ_LIBS) OBJ_CLIENT := $(OBJ_SRC_CLIENT) $(OBJ_LIBS_CLIENT)
VPATH := $(SRC_DIR) $(wildcard $(LIB_DIR)/*) VPATH := $(SRC_DIR) $(wildcard $(LIB_DIR)/*)
.DEFAULT_GOAL := all .DEFAULT_GOAL := all
.PHONY: all clean cleanall .PHONY: all clean cleanall
@ -70,7 +71,11 @@ $(BUILD_DIR)/server: $(OBJ_SERVER)
# -CLIENT-RULES----------------------------------------------------------------- # -CLIENT-RULES-----------------------------------------------------------------
$(OBJ_DIR)/client.o: client.c $(OBJ_DIR)/api.o: api.c api.h
@$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
@echo $@
$(OBJ_DIR)/client.o: client.c api.h
@$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@ @$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
@echo $@ @echo $@
@ -87,4 +92,4 @@ cleanall : clean
@rm -rf $(OBJ_DIR)/* @rm -rf $(OBJ_DIR)/*
@rm -f $(SOCKET) @rm -f $(SOCKET)
# print-% : ; @echo $* = $($*) print-% : ; @echo $* = $($*)

67
lib/api/api.c Normal file
View File

@ -0,0 +1,67 @@
#include <api.h>
// -----------------------------------------------------------------------------
/* funzioni ausiliarie */
// -----------------------------------------------------------------------------
int openConnection(const char* sockname, int msec, const struct timespec abstime){
return 1;
}
int closeConnection(const char* sockname){
return 1;
}
int openFile(const char* pathname, int flags){
return 1;
}
int readFile(const char* pathname, void** buf, size_t* size){
return 1;
}
int readNFiles(int N, const char* dirname){
return 1;
}
int writeFile(const char* pathname, const char* dirname){
return 1;
}
int appendToFile(const char* pathname, void* buf, size_t size, const char* dirname){
return 1;
}
int lockFile(const char* pathname){
return 1;
}
int unlockFile(const char* pathname){
return 1;
}
int closeFile(const char *pathname){
return 1;
}
int removeFile(const char* pathname){
return 1;
}
int setDirectory(char* Dir, int rw){
return 1;
}
void printInfo(int p){
return;
}

40
lib/api/api.h Normal file
View File

@ -0,0 +1,40 @@
#pragma once
#ifndef _API_CLIENT
#define _API_CLIENT
#include <time.h>
// struttura dati per la lista dei file aperti
typedef struct openFile_s {
char *filename; // nome del file
struct openFile_s *next; // puntatore al prossimo elemento nella lista
} openFile_t;
int openConnection(const char* sockname, int msec, const struct timespec abstime);
int closeConnection(const char* sockname);
int openFile(const char* pathname, int flags);
int readFile(const char* pathname, void** buf, size_t* size);
int readNFiles(int N, const char* dirname);
int writeFile(const char* pathname, const char* dirname);
int appendToFile(const char* pathname, void* buf, size_t size, const char* dirname);
int lockFile(const char* pathname);
int unlockFile(const char* pathname);
int closeFile(const char *pathname);
int removeFile(const char* pathname);
int setDirectory(char* Dir, int rw);
void printInfo(int p);
#endif /* _API_CLIENT */

View File

@ -1,3 +1,190 @@
int main() { #include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <api.h>
#define UNIX_PATH_MAX 256
#define MAXARGLENGTH 256
static char globalSocket[UNIX_PATH_MAX] = "";
// struttura della lista dei comandi
typedef struct cmd_s {
char name; // nome del comando
char *arg; // (eventuale) argomento del comando
struct cmd_s *next; // puntatore al prossimo comando nella lista
} cmd_t;
// struttura dati per il comando -w
typedef struct cmdw_s {
char *dir;
int print;
int tot;
int curn;
} cmdw_t;
// -----------------------------------------------------------------------------
// helper functions
// libera la memoria della lista dei comandi
void destroyCommandList(cmd_t *l);
// aggiunge un comando alla lista
int addCommand(cmd_t **l, char cmd, char *arg);
// per chiudere la connessione prima dell'uscita
void cleanup() {
if (strncmp(globalSocket, "", 1) != 0) {
closeConnection(globalSocket);
}
}
// -h
static void usage(const char *argv0) {
// TODO change this
fprintf(stdout, "use: %s <config file location>\n", argv0);
}
// -----------------------------------------------------------------------------
// MAIN
int main(int argc, char* argv[]) {
atexit(cleanup);
if(argc <= 1) { // no arguments => -h
usage(argv[0]);
return 0;
}
struct sigaction siga;
// ignoro il segnale SIGPIPE
memset(&siga, 0, sizeof(siga));
siga.sa_handler = SIG_IGN;
if (sigaction(SIGPIPE, &siga, NULL) == -1) {
perror("sigaction.\n");
return 1;
}
// lista dei comandi
cmd_t *cmds = NULL;
cmds = calloc(1, sizeof(cmd_t));
// struttra per -w
cmdw_t *cmdw = NULL;
int opt;
char args[MAXARGLENGTH];
char f = 0;
// add args to list
while ((opt = getopt(argc, argv, ":hpf:t:w:W:D:r:R:d:l:u:c:")) != -1) {
switch (opt) {
case 'h': // help message
usage(argv[0]);
goto _cleanup;
case 'f': // socket name
if(!f) {
if (optarg && strnlen(optarg, MAXARGLENGTH) > 0 && optarg[0] == '-') {
fprintf(stderr, "Il comando -f necessita di un argomento.\n");
goto _cleanup;
}
memset(args, 0, MAXARGLENGTH);
strncpy(args, optarg, strnlen(optarg, MAXARGLENGTH-1)+1);
addCommand(&cmds, opt, optarg);
++f;
}
break;
case 'p': // print to stdout
printInfo(1);
break;
case 'w': // send files from folder (n is specified after)
if (optarg && strnlen(optarg, MAXARGLENGTH) > 0 && optarg[0] == '-') {
fprintf(stderr, "Il comando -w necessita di un argomento.\n");
goto _cleanup;
}
if(!cmdw) {
cmdw = calloc(1, sizeof(cmdw_t));
if(!cmdw) {
perror("calloc");
goto _cleanup;
}
}
memset(args, 0, MAXARGLENGTH);
strncpy(args, optarg, strnlen(optarg, MAXARGLENGTH-1)+1);
addCommand(&cmds, opt, args);
break;
}
}
return 0;
_cleanup:
if(cmds) {
destroyCommandList(cmds);
}
return 0;
}
// -----------------------------------------------------------------------------
void destroyCommandList(cmd_t *l) {
if (!l) {
errno = EINVAL;
return;
}
cmd_t *tmp;
// scorro tutta la lista e libero la memoria
while (l) {
tmp = l;
free(l->arg);
l = l->next;
free(tmp);
}
}
int addCommand(cmd_t **l, char cmd, char *arg) {
if(!l) {
errno = EINVAL;
return -1;
}
cmd_t *new = calloc(1, sizeof(cmd_t));
if(!new) {
perror("calloc");
return -1;
}
new->name = cmd;
if (arg) {
new->arg = malloc(MAXARGLENGTH);
if (new->arg == NULL) {
perror("malloc arg");
free(new);
return -1;
}
strncpy(new->arg, arg, strnlen(arg, MAXARGLENGTH-1)+1);
}
new->next = NULL;
cmd_t *tail = *l;
// se lista vuota aggiungo in cima, altrimenti scorro la lista
if (*l == NULL) {
*l = new;
return 0;
}
while (tail->next) {
tail = tail->next;
}
tail->next = new;
return 0; return 0;
} }