#include "fserv-private.h"
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>
static pthread_once_t once = PTHREAD_ONCE_INIT;
static
void
__fserv_construct(
void
)
{
if (once_status)
{
goto error;
}
if (once_status)
{
goto error;
}
if (once_status)
{
goto error;
}
client,
FSERV_SOCKET_PATH);
if (once_status)
{
goto error;
}
if (once_status)
{
goto error;
}
error:
return;
}
static
fserv_construct(
void
)
{
pthread_once(&once, __fserv_construct);
return once_status;
}
static
void
__attribute__((destructor))
fserv_destruct(
void
)
{
if (client)
{
session = NULL;
client = NULL;
}
if (protocol)
{
protocol = NULL;
}
}
int
fserv_open(
const char* path,
FServMode mode,
FServFile** file
)
{
int ret = 0;
OpenRequest request;
status = fserv_construct();
if (status)
{
ret = -1;
goto error;
}
if (status)
{
ret = -1;
goto error;
}
request.mode = mode;
request.path = (char*) path;
if (status)
{
ret = -1;
goto error;
}
{
case FSERV_OPEN_RES:
break;
case FSERV_ERROR_RES:
ret = ((StatusReply*) out.
data)->err;
goto error;
default:
ret = EINVAL;
goto error;
}
done:
if (call)
{
}
return ret;
error:
if (file)
{
free(file);
}
goto done;
}
int
fserv_read(
FServFile* file,
unsigned long size,
void* buffer,
unsigned long* size_read
)
{
int ret = 0;
ReadRequest request;
ReadReply* reply;
if (status)
{
ret = -1;
goto error;
}
request.size = size;
if (status)
{
ret = -1;
goto error;
}
{
case FSERV_READ_RES:
reply = (ReadReply*) out.
data;
memcpy(buffer, reply->data, reply->size);
*size_read = reply->size;
break;
case FSERV_ERROR_RES:
ret = ((StatusReply*) out.
data)->err;
goto error;
default:
ret = EINVAL;
goto error;
}
done:
if (call)
{
}
return ret;
error:
goto done;
}
int
fserv_write(
FServFile* file,
unsigned long size,
void* buffer
)
{
int ret = 0;
WriteRequest request;
if (status)
{
ret = -1;
goto error;
}
request.size = size;
request.data = (char*) buffer;
in.
tag = FSERV_WRITE_REQ;
if (status)
{
ret = -1;
goto error;
}
{
case FSERV_VOID_RES:
break;
case FSERV_ERROR_RES:
ret = ((StatusReply*) out.
data)->err;
goto error;
default:
ret = EINVAL;
goto error;
}
done:
if (call)
{
}
return ret;
error:
goto done;
}
int
fserv_close(
FServFile* file
)
{
int ret = 0;
if (status)
{
ret = -1;
goto error;
}
in.
tag = FSERV_CLOSE_REQ;
if (status)
{
ret = -1;
goto error;
}
{
case FSERV_VOID_RES:
break;
case FSERV_ERROR_RES:
ret = ((StatusReply*) out.
data)->err;
if (ret)
{
goto error;
}
break;
default:
ret = EINVAL;
goto error;
}
error:
if (call)
{
}
return ret;
}