sysdis-tp/lib.c

270 lines
5.4 KiB
C

#include "lib.h"
int debug(const char* tag, const char* msg){
/* (1) Get number of characters to add */
int diff = DEBUG_LEN - strlen(msg) - strlen(tag) - 3;
/* (2) print msg */
printf("[%s] %s", tag, msg);
/* (3) print missing characters */
for( ; diff >= 0 ; diff-- )
printf(".");
return 1;
}
int xbind(const int port){
/* [0] Initialization
=========================================================*/
int xsocket, bound, clientsock;
static struct sockaddr_in addr;
/* [1] Create xsocket
=========================================================*/
/* (1) Create UPD xsocket */
DEBUG&& debug("xbind", "creating server socket");
xsocket = socket(AF_INET, SOCK_STREAM, 0);
/* (r2-) Manage error */
if( xsocket == -1 ){
DEBUG&& printf("error\n");
return -1;
}
DEBUG&& printf("done\n");
/* [2] Set xsocket address information
=========================================================*/
/* (1) Reset values */
bzero(&addr, sizeof(struct sockaddr_in));
/* (2) Set xsocket addr */
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
/* [3] Bind to port
=========================================================*/
/* (1) Bind and return -1 if error */
DEBUG&& debug("xbind", "binding socket to port");
bound = bind(xsocket, (struct sockaddr*)&addr, sizeof(addr));
/* (2) Manage error */
if( bound == -1 ){
DEBUG&& printf("error\n");
return -1;
}
DEBUG&& printf("done\n");
/* [4] Mark socket so it will listen for incoming co.
=========================================================*/
DEBUG&& debug("xbind", "listen for client");
if( listen(xsocket, 1) < 0 ){
DEBUG&& printf("error\n");
return -1;
}
DEBUG&& printf("done\n");
/* [5] Return xsocket
=========================================================*/
return xsocket;
}
int xlisten(const int xsocket, struct sockaddr_in* client){
/* [1] Initialization
=========================================================*/
unsigned int sock_len;
int clientsock;
/* [2] Wait for client
=========================================================*/
/* (1) Wait for incoming client connection */
DEBUG&& debug("xlisten", "listening for client");
clientsock = accept(xsocket, (struct sockaddr*) client, &sock_len);
/* (2) Manage errors */
if( clientsock == -1 ){
DEBUG&& printf("error\n");
return -1;
}
DEBUG&& printf("done\n");
return clientsock;
}
int xconnect(const char* hostname, const int port, struct sockaddr_in* serv){
/* [0] Initialization
=========================================================*/
int xsocket, bound, connected;
struct hostent *host; // data found by lookup
/* [1] Create xsocket
=========================================================*/
/* (1) Create UPD xsocket */
DEBUG&& debug("xconnect", "creating client socket");
xsocket = socket(AF_INET, SOCK_STREAM, 0);
/* (r2-) Manage error */
if( xsocket == -1 ){
DEBUG&& printf("error\n");
return -1;
}
DEBUG&& printf("done\n");
/* [2] Get information by hostname
=========================================================*/
/* (1) Process */
DEBUG&& debug("xconnect", "fetch info by hostname");
host = gethostbyname(hostname);
/* (2) Manage error */
if( host == NULL ){
DEBUG&& printf("error\n");
return -1;
}
DEBUG&& printf("found\n");
/* [3] Set server useful information from fetched info
=========================================================*/
/* (1) Reset values */
DEBUG&& debug("xconnect", "building server info");
bzero(serv, sizeof(struct sockaddr_in));
/* (2) Set server info (ipv4, port) */
serv->sin_family = AF_INET;
serv->sin_port = htons(port);
/* (3) Copy server address */
memcpy( &serv->sin_addr.s_addr, host->h_addr, host->h_length);
DEBUG&& printf("built\n");
/* [4] Connect to server
=========================================================*/
/* (1) Try to connect to given server */
DEBUG&& debug("xconnect", "connecting to server");
connected = connect(xsocket, (struct sockaddr*) serv, sizeof(*serv));
/* (2) Manage error */
if( connected == -1 ){
DEBUG&& printf("error\n");
return -1;
}
DEBUG&& printf("done\n");
// return socket
return xsocket;
}
int xread(const int xsocket, char* buffer, int bufsize){
/* [1] Wait for message through xsocket
=========================================================*/
/* (1) Memory allocation */
buffer = (char*) realloc(buffer, sizeof(char) * bufsize );
/* (2) Listen */
DEBUG&& debug("xread", "waiting for data");
int read = recv(xsocket, buffer, bufsize, 0);
/* (3) Manage error */
if( read == -1 ){
DEBUG&& printf("error\n");
return -1;
}
DEBUG&& printf("received\n");
DEBUG&& printf("[xread:received] '%s'\n", buffer);
/* [2] Return number of read characters
=========================================================*/
return read;
}
int xwrite(const int xsocket, char* buffer){
/* [1] Send buffer (message) to target
=========================================================*/
/* (1) Useful data */
unsigned int addr_len = sizeof(struct sockaddr_in);
/* (2) Send data */
DEBUG&& debug("xwrite", "sending data");
int sent = send(xsocket, buffer, strlen(buffer), 0);
/* (3) Manage error */
if( sent == -1 ){
DEBUG&& printf("error\n");
return -1;
}
DEBUG&& printf("sent\n");
DEBUG&& printf("[xwrite:sent] '%s'\n", buffer);
/* [2] Return number of sent characters
=========================================================*/
return sent;
}