2016-12-17 18:00:04 +01:00
|
|
|
#include "usocket.h"
|
2016-12-19 19:20:27 +01:00
|
|
|
#include "utils.h"
|
2016-12-21 02:56:52 +01:00
|
|
|
#include "error.h"
|
|
|
|
|
2016-12-18 00:54:43 +01:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <unistd.h>
|
2016-12-17 18:00:04 +01:00
|
|
|
#include <assert.h>
|
|
|
|
|
|
|
|
int usock_send (const int fd, const char *buf, const int msize)
|
|
|
|
{
|
2016-12-23 01:33:52 +01:00
|
|
|
// print_hexa ("msg send", (unsigned char *)buf, msize);
|
|
|
|
// fflush(stdout);
|
2016-12-19 19:20:27 +01:00
|
|
|
|
2017-01-19 22:07:52 +01:00
|
|
|
ssize_t ret = 0;
|
2016-12-17 18:00:04 +01:00
|
|
|
//printf ("%ld bytes to write\n", msize);
|
|
|
|
ret = send (fd, buf, msize, 0);
|
2016-12-19 19:20:27 +01:00
|
|
|
if (ret <= 0)
|
|
|
|
handle_err ("usock_send", "send ret <= 0");
|
2017-01-19 22:07:52 +01:00
|
|
|
return (int) ret;
|
2016-12-17 18:00:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
int usock_recv (const int fd, char **buf, size_t *msize)
|
|
|
|
{
|
|
|
|
assert(buf != NULL);
|
|
|
|
assert(msize != NULL);
|
|
|
|
|
|
|
|
if (buf == NULL) {
|
|
|
|
handle_err ("usock_recv", "buf == NULL");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (msize == NULL) {
|
|
|
|
handle_err ("usock_recv", "msize == NULL");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*buf == NULL) {
|
|
|
|
// do not allocate too much memory
|
2016-12-19 19:20:27 +01:00
|
|
|
if (*msize > BUFSIZ)
|
|
|
|
handle_err ("usock_recv", "msize > BUFSIZ");
|
2016-12-21 02:56:52 +01:00
|
|
|
if (*msize == 0)
|
|
|
|
*msize = BUFSIZ;
|
2016-12-17 18:00:04 +01:00
|
|
|
*buf = malloc ((*msize < BUFSIZ) ? *msize : BUFSIZ);
|
|
|
|
}
|
|
|
|
|
|
|
|
int ret = 0;
|
|
|
|
ret = recv (fd, *buf, *msize, 0);
|
|
|
|
if (ret < 0) {
|
|
|
|
handle_err ("usock_recv", "recv ret < 0");
|
|
|
|
*msize = 0;
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
*msize = (size_t) ret;
|
2016-12-23 01:33:52 +01:00
|
|
|
// print_hexa ("msg recv", (unsigned char *)*buf, *msize);
|
|
|
|
// fflush(stdout);
|
2016-12-17 18:00:04 +01:00
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
int usock_connect (int *fd, const char *path)
|
|
|
|
{
|
|
|
|
assert (fd != NULL);
|
|
|
|
assert (path != NULL);
|
|
|
|
|
|
|
|
if (fd == NULL) {
|
|
|
|
handle_err ("usock_connect", "fd == NULL");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (path == NULL) {
|
|
|
|
handle_err ("usock_connect", "path == NULL");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int sfd;
|
|
|
|
struct sockaddr_un my_addr;
|
|
|
|
socklen_t peer_addr_size;
|
|
|
|
|
2016-12-18 00:54:43 +01:00
|
|
|
sfd = socket (AF_UNIX, SOCK_STREAM, 0);
|
2016-12-17 18:00:04 +01:00
|
|
|
if (sfd == -1) {
|
|
|
|
handle_err ("usock_connect", "sfd == -1");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// clear structure
|
|
|
|
memset(&my_addr, 0, sizeof(struct sockaddr_un));
|
|
|
|
|
|
|
|
my_addr.sun_family = AF_UNIX;
|
|
|
|
strncpy(my_addr.sun_path, path, strlen (path));
|
|
|
|
|
|
|
|
peer_addr_size = sizeof(struct sockaddr_un);
|
|
|
|
if(connect(sfd, (struct sockaddr *) &my_addr, peer_addr_size) == -1) {
|
|
|
|
handle_err ("usock_connect", "connect == -1");
|
|
|
|
perror("connect()");
|
|
|
|
exit(errno);
|
|
|
|
}
|
|
|
|
|
|
|
|
*fd = sfd;
|
2016-12-18 00:54:43 +01:00
|
|
|
|
|
|
|
return 0;
|
2016-12-17 18:00:04 +01:00
|
|
|
}
|
|
|
|
|
2016-12-18 00:54:43 +01:00
|
|
|
int usock_init (int *fd, const char *path)
|
2016-12-17 18:00:04 +01:00
|
|
|
{
|
|
|
|
assert (fd != NULL);
|
|
|
|
assert (path != NULL);
|
|
|
|
|
|
|
|
if (fd == NULL) {
|
2016-12-18 00:54:43 +01:00
|
|
|
handle_err ("usock_init", "fd == NULL");
|
2016-12-17 18:00:04 +01:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (path == NULL) {
|
2016-12-18 00:54:43 +01:00
|
|
|
handle_err ("usock_init", "path == NULL");
|
2016-12-17 18:00:04 +01:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int sfd;
|
|
|
|
struct sockaddr_un my_addr;
|
|
|
|
socklen_t peer_addr_size;
|
|
|
|
|
2016-12-18 00:54:43 +01:00
|
|
|
sfd = socket (AF_UNIX, SOCK_STREAM, 0);
|
2016-12-17 18:00:04 +01:00
|
|
|
if (sfd == -1) {
|
2016-12-18 00:54:43 +01:00
|
|
|
handle_err ("usock_init", "sfd == -1");
|
2016-12-17 18:00:04 +01:00
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// clear structure
|
|
|
|
memset(&my_addr, 0, sizeof(struct sockaddr_un));
|
|
|
|
|
|
|
|
my_addr.sun_family = AF_UNIX;
|
|
|
|
strncpy(my_addr.sun_path, path, strlen (path));
|
|
|
|
|
|
|
|
// TODO FIXME
|
|
|
|
// delete the unix socket if already created
|
|
|
|
|
|
|
|
peer_addr_size = sizeof(struct sockaddr_un);
|
2016-12-18 00:54:43 +01:00
|
|
|
|
|
|
|
if (bind (sfd, (struct sockaddr *) &my_addr, peer_addr_size) == -1) {
|
|
|
|
handle_err ("usock_init", "bind == -1");
|
2016-12-17 18:00:04 +01:00
|
|
|
perror("bind()");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
2016-12-18 00:54:43 +01:00
|
|
|
if (listen (sfd, LISTEN_BACKLOG) == -1) {
|
|
|
|
handle_err ("usock_init", "listen == -1");
|
2016-12-17 18:00:04 +01:00
|
|
|
perror("listen()");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
*fd = sfd;
|
|
|
|
|
2016-12-18 00:54:43 +01:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int usock_accept (int fd, int *pfd)
|
|
|
|
{
|
|
|
|
assert (pfd != NULL);
|
|
|
|
|
|
|
|
if (pfd == NULL) {
|
|
|
|
handle_err ("usock_accept", "pfd == NULL");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct sockaddr_un peer_addr;
|
|
|
|
memset (&peer_addr, 0, sizeof (struct sockaddr_un));
|
2016-12-19 22:49:26 +01:00
|
|
|
socklen_t peer_addr_size = 0;
|
2016-12-18 00:54:43 +01:00
|
|
|
|
|
|
|
*pfd = accept (fd, (struct sockaddr *) &peer_addr, &peer_addr_size);
|
|
|
|
if (*pfd < 0) {
|
|
|
|
handle_err ("usock_accept", "accept < 0");
|
|
|
|
perror("listen()");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
2016-12-17 18:00:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
int usock_close (int fd)
|
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
ret = close (fd);
|
|
|
|
if (ret < 0) {
|
|
|
|
handle_err ("usock_close", "close ret < 0");
|
|
|
|
perror ("closing");
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
2016-12-18 00:54:43 +01:00
|
|
|
|
|
|
|
int usock_remove (const char *path)
|
|
|
|
{
|
|
|
|
return unlink (path);
|
|
|
|
}
|