c3po/base/network_plain/network.c

65 lines
1.6 KiB
C

#include <config/api.h>
#include "network.h"
unsigned int pluginType() {
return PLUGIN_TYPE_NETWORK;
}
const char* pluginName() {
return "plain";
}
void* pluginConnect(const char* host, int port) {
NETWORK_PLAIN* connection;
struct sockaddr_in address;
struct hostent* hp;
if((connection = malloc(sizeof(NETWORK_PLAIN))) == NULL) {
configErrorPush("Unable to malloc");
return NULL;
}
if((hp = gethostbyname(host)) == NULL) {
configErrorPush("Unable to resolve hostname");
free(connection);
return NULL;
}
if((connection->socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
configErrorPush("Unable to create a socket");
free(connection);
return NULL;
}
address.sin_family = AF_INET;
address.sin_port = htons(port);
address.sin_addr.s_addr = *(u_long*)hp->h_addr;
if(connect(connection->socket, (struct sockaddr*) &address, sizeof(struct sockaddr)) == -1) {
configErrorPush("Unable to establish a connection");
free(connection);
return NULL;
}
/* TODO: Non-blocking */
return connection;
}
int pluginSocketGet(NETWORK_PLAIN* connection) {
return connection->socket;
}
int pluginReadData(NETWORK_PLAIN* connection, char* buffer, int buffer_len) {
return recv(connection->socket, buffer, buffer_len, 0);
}
int pluginSendData(NETWORK_PLAIN* connection, char* buffer, int buffer_len) {
return send(connection->socket, buffer, buffer_len, 0);
}
void* pluginSocketDone(NETWORK_PLAIN* connection) {
close(connection->socket);
free(connection);
return NULL;
}