version 1.1.2.3, 2010/06/23 17:29:07
|
version 1.1.2.4, 2010/06/24 11:01:46
|
Line 2
|
Line 2
|
|
|
|
|
/* |
/* |
|
* rpc_srv_blobCreate() Create map blob to memory region and return object |
|
* @srv = RPC Server instance |
|
* @len = BLOB length object |
|
* return: NULL error or !=NULL allocated BLOB object |
|
*/ |
|
inline rpc_blob_t * |
|
rpc_srv_blobCreate(rpc_srv_t * __restrict srv, int len) |
|
{ |
|
rpc_blob_t *blob = NULL; |
|
char szFName[MAXPATHLEN]; |
|
int f; |
|
|
|
memset(szFName, 0, MAXPATHLEN); |
|
snprintf(szFName, MAXPATHLEN, "%s/BLOB-XXXXXXXX", srv->srv_blob.dir); |
|
f = mkstemp(szFName); |
|
if (f == -1) { |
|
LOGERR; |
|
return NULL; |
|
} |
|
if (lseek(f, len - 1, SEEK_SET) == -1) { |
|
LOGERR; |
|
close(f); |
|
unlink(szFName); |
|
return NULL; |
|
} else |
|
write(f, "", 1); |
|
|
|
blob = malloc(sizeof(rpc_blob_t)); |
|
if (!blob) { |
|
LOGERR; |
|
close(f); |
|
unlink(szFName); |
|
return NULL; |
|
} |
|
|
|
blob->blob_data = mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, f, 0); |
|
if (blob->blob_data == MAP_FAILED) { |
|
LOGERR; |
|
free(blob); |
|
close(f); |
|
unlink(szFName); |
|
return NULL; |
|
} else |
|
close(f); |
|
|
|
blob->blob_len = len; |
|
blob->blob_var = strtol(strrchr(szFName, '-') + 1, NULL, 16); |
|
return blob; |
|
} |
|
|
|
/* |
* rpc_srv_blobMap() Map blob to memory region |
* rpc_srv_blobMap() Map blob to memory region |
* @srv = RPC Server instance |
* @srv = RPC Server instance |
* @blob = Map to this BLOB element |
* @blob = Map to this BLOB element |
Line 41 rpc_srv_blobMap(rpc_srv_t * __restrict srv, rpc_blob_t
|
Line 92 rpc_srv_blobMap(rpc_srv_t * __restrict srv, rpc_blob_t
|
} else { |
} else { |
blob->blob_len = sb.st_size; |
blob->blob_len = sb.st_size; |
close(f); |
close(f); |
|
|
|
madvise(blob->blob_data, sb.st_size, MADV_SEQUENTIAL); |
} |
} |
|
|
return 0; |
return 0; |
Line 123 rpc_srv_sendBLOB(rpc_cli_t * __restrict cli, rpc_blob_
|
Line 176 rpc_srv_sendBLOB(rpc_cli_t * __restrict cli, rpc_blob_
|
/* |
/* |
* rpc_srv_recvBLOB() Receive BLOB from client |
* rpc_srv_recvBLOB() Receive BLOB from client |
* @cli = Client instance |
* @cli = Client instance |
* return: -1 error, 0 ok | * @blob = Mapped BLOB element |
| * return: -1 error, 0 ok, >0 unreceived data from client, may be error? |
*/ |
*/ |
int |
int |
rpc_srv_recvBLOB(rpc_cli_t * __restrict cli) | rpc_srv_recvBLOB(rpc_cli_t * __restrict cli, rpc_blob_t * __restrict blob) |
{ |
{ |
int ret, len; |
int ret, len; |
uint8_t *pos; |
uint8_t *pos; |
rpc_srv_t *s; | fd_set fds; |
| struct timeval tv = { DEF_RPC_TIMEOUT, 0 }; |
|
|
if (!cli || !cli->cli_parent) { | if (!cli || !blob || !blob->blob_data) { |
rpc_SetErr(EINVAL, "Error:: invalid arguments ...\n"); |
rpc_SetErr(EINVAL, "Error:: invalid arguments ...\n"); |
return -1; |
return -1; |
} else | } |
s = cli->cli_parent; | |
|
|
|
for (ret = blob->blob_len, pos = blob->blob_data; ret > 0; ret -= len, pos += len) { |
|
FD_ZERO(&fds); |
|
FD_SET(cli->cli_sock, &fds); |
|
len = select(cli->cli_sock + 1, &fds, NULL, NULL, &tv); |
|
if (len < 1) { |
|
LOGERR; |
|
return -1; |
|
} |
|
|
|
if ((len = recv(cli->cli_sock, pos, BLOBSIZ, 0)) == -1) { |
|
LOGERR; |
|
return -1; |
|
} |
|
} |
|
|
return ret; |
return ret; |
} |
} |