netspool send
This commit is contained in:
parent
9f87fcc37f
commit
b5f3f48f0d
@ -188,62 +188,80 @@ void netspool_receive(s_netspool_state *state)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int netspool_read(s_netspool_state *state, void *buf, int buflen)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
if( state->length == 0 ) {
|
||||||
|
puts("everithing is read");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
n = recv(state->socket, buf, state->length>buflen? buflen: state->length, 0);
|
||||||
|
|
||||||
|
if(n==0) {
|
||||||
|
state->state = NS_ERROR;
|
||||||
|
state->error = "remote socket shutdown";
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(n==-1) {
|
||||||
|
puts("error reading data");
|
||||||
|
printf("%d %s\n", errno, strerror(errno));
|
||||||
|
state->state = NS_ERROR;
|
||||||
|
state->error = "IO error";
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
state->length -= n;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
void netspool_acknowledge(s_netspool_state *state)
|
||||||
|
{
|
||||||
|
char strbuf[STRBUF];
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if( state->length > 0 ) {
|
||||||
|
state->state = NS_ERROR;
|
||||||
|
state->error = "Too early acknowledgement";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf(strbuf, STRBUF, "DONE %s", state->filename);
|
||||||
|
r = sendstr(state->socket, strbuf);
|
||||||
|
if( r ) { state->state = NS_ERROR; state->error = "IO error"; return; }
|
||||||
|
|
||||||
|
state->state = NS_RECEIVING;
|
||||||
|
state->filename[0] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void netspool_end(s_netspool_state *state)
|
||||||
|
{
|
||||||
|
sendstr(state->socket, "END satisfied");
|
||||||
|
close(state->socket);
|
||||||
|
state->state = NS_NOTINIT;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
void savefile(const char *fn, unsigned long long l, int s)
|
void savefile(const char *fn, unsigned long long l, int s)
|
||||||
{
|
{
|
||||||
char BUF[STRBUF];
|
char BUF[STRBUF];
|
||||||
int n, n1;
|
int n, n1;
|
||||||
int f;
|
int f;
|
||||||
f=open(fn, O_CREAT|O_EXCL|O_WRONLY, 0666);
|
f=open(fn, O_CREAT|O_EXCL|O_WRONLY, 0664);
|
||||||
if(f==-1) {
|
if(f==-1) {
|
||||||
puts("error open file");
|
puts("error open file");
|
||||||
printf("%d %s\n", errno, strerror(errno));
|
printf("%d %s\n", errno, strerror(errno));
|
||||||
exit(-3);
|
exit(-3);
|
||||||
}
|
}
|
||||||
while(l) {
|
while(l) {
|
||||||
n=recv(s, BUF, l>STRBUF?STRBUF:l, 0);
|
|
||||||
if(n==0){
|
|
||||||
puts("remote socket shutdown");
|
|
||||||
exit(-3);
|
|
||||||
}
|
|
||||||
if(n==-1){
|
|
||||||
puts("error reading data");
|
|
||||||
printf("%d %s\n", errno, strerror(errno));
|
|
||||||
exit(-3);
|
|
||||||
}
|
|
||||||
n1 = write(f, BUF, n);
|
n1 = write(f, BUF, n);
|
||||||
if(n1!=n) {
|
if(n1!=n) {
|
||||||
puts("error writing file");
|
puts("error writing file");
|
||||||
printf("%d %s\n", errno, strerror(errno));
|
printf("%d %s\n", errno, strerror(errno));
|
||||||
exit(-3);
|
exit(-3);
|
||||||
}
|
}
|
||||||
l-=n;
|
|
||||||
}
|
}
|
||||||
close(f);
|
close(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
|
||||||
char filename[STRBUF];
|
|
||||||
unsigned long long length;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
filename[0]=0;
|
|
||||||
while(1) {
|
|
||||||
savefile(filename, length, s);
|
|
||||||
sprintf(strbuf, "DONE %s", filename);
|
|
||||||
sendstr(s, strbuf);
|
|
||||||
filename[0]=0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
puts("!!!");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
sendstr(s, "END satisfied");
|
|
||||||
close(s);
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
|
@ -199,36 +199,43 @@ int p_tx_fopen(s_protinfo *pi)
|
|||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
get_next_file:
|
get_next_file:
|
||||||
if( prot_get_next_file(&ptrl, pi) || !ptrl )
|
if( prot_get_next_file(&ptrl, pi) )
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
/* Mark this file as "processed" */
|
|
||||||
ptrl->status = STATUS_SENDING;
|
|
||||||
|
|
||||||
pi->send_left_num -= 1;
|
if( ptrl ) {
|
||||||
pi->send_left_size -= ptrl->size;
|
|
||||||
|
|
||||||
if( pi->send_left_size < 0 )
|
/* Mark this file as "processed" */
|
||||||
|
ptrl->status = STATUS_SENDING;
|
||||||
|
|
||||||
|
pi->send_left_num -= 1;
|
||||||
|
pi->send_left_size -= ptrl->size;
|
||||||
|
|
||||||
|
if( pi->send_left_size < 0 )
|
||||||
pi->send_left_size = 0;
|
pi->send_left_size = 0;
|
||||||
if( pi->send_left_num < 0 )
|
if( pi->send_left_num < 0 )
|
||||||
pi->send_left_num = 0;
|
pi->send_left_num = 0;
|
||||||
|
|
||||||
|
DEB((D_PROT, "p_tx_fopen: now opening \"%s\"", ptrl->fname));
|
||||||
|
|
||||||
/* Reset MinCPS time counter */
|
if( stat(ptrl->fname, &st) ) {
|
||||||
pi->tx_low_cps_time = 0;
|
|
||||||
|
|
||||||
DEB((D_PROT, "p_tx_fopen: now opening \"%s\"", ptrl->fname));
|
|
||||||
|
|
||||||
if( stat(ptrl->fname, &st) )
|
|
||||||
{
|
|
||||||
logerr("send: cannot stat file \"%s\"", ptrl->fname);
|
logerr("send: cannot stat file \"%s\"", ptrl->fname);
|
||||||
goto get_next_file;
|
goto get_next_file;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( (fp = file_open(ptrl->fname, "r")) == NULL )
|
if( (fp = file_open(ptrl->fname, "r")) == NULL ) {
|
||||||
{
|
|
||||||
logerr("send: cannot open file \"%s\"", ptrl->fname);
|
logerr("send: cannot open file \"%s\"", ptrl->fname);
|
||||||
goto get_next_file;
|
goto get_next_file;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#ifndef NETSPOOL
|
||||||
|
else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Reset MinCPS time counter */
|
||||||
|
pi->tx_low_cps_time = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add new entry to the send files queue
|
* Add new entry to the send files queue
|
||||||
@ -250,6 +257,25 @@ get_next_file:
|
|||||||
/*
|
/*
|
||||||
* Set file information
|
* Set file information
|
||||||
*/
|
*/
|
||||||
|
#ifdef NETSPOOL
|
||||||
|
if( !ptrl ) {
|
||||||
|
/* send file received through netspool */
|
||||||
|
pi->send->fp = 0;
|
||||||
|
pi->send->local_name = "NETSPOOL";
|
||||||
|
pi->send->type = out_filetype(state.netspool.filename);
|
||||||
|
pi->send->net_name = recode_file_out(p_convfilename(state.netspool.filename, pi->send->type));
|
||||||
|
pi->send->fname = NULL;
|
||||||
|
pi->send->mod_time = time(NULL);
|
||||||
|
pi->send->mode = 0664;
|
||||||
|
pi->send->bytes_total = state.netspool.length;
|
||||||
|
pi->send->start_time = time(NULL);
|
||||||
|
pi->send->eofseen = FALSE;
|
||||||
|
pi->send->status = FSTAT_PROCESS;
|
||||||
|
pi->send->action = ACTION_ACKNOWLEDGE;
|
||||||
|
pi->send->flodsc = -1;
|
||||||
|
} else {
|
||||||
|
|
||||||
|
#endif
|
||||||
pi->send->fp = fp;
|
pi->send->fp = fp;
|
||||||
pi->send->local_name = (char*)xstrcpy(file_getname(ptrl->fname));
|
pi->send->local_name = (char*)xstrcpy(file_getname(ptrl->fname));
|
||||||
pi->send->net_name = recode_file_out(p_convfilename(pi->send->local_name, ptrl->type));
|
pi->send->net_name = recode_file_out(p_convfilename(pi->send->local_name, ptrl->type));
|
||||||
@ -265,7 +291,11 @@ get_next_file:
|
|||||||
pi->send->type = ptrl->type;
|
pi->send->type = ptrl->type;
|
||||||
pi->send->action = ptrl->action;
|
pi->send->action = ptrl->action;
|
||||||
pi->send->flodsc = ptrl->flodsc;
|
pi->send->flodsc = ptrl->flodsc;
|
||||||
|
|
||||||
|
#idef NETSPOOL
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if( strcmp(pi->send->local_name, pi->send->net_name) == 0 )
|
if( strcmp(pi->send->local_name, pi->send->net_name) == 0 )
|
||||||
{
|
{
|
||||||
log("send: \"%s\" %d bytes",
|
log("send: \"%s\" %d bytes",
|
||||||
@ -404,6 +434,11 @@ int p_tx_fclose(s_protinfo *pi)
|
|||||||
else if( errno != ENOENT )
|
else if( errno != ENOENT )
|
||||||
logerr("send: cannot truncate file \"%s\"", pi->send->fname);
|
logerr("send: cannot truncate file \"%s\"", pi->send->fname);
|
||||||
break;
|
break;
|
||||||
|
#ifdef NETSPOOL
|
||||||
|
case ACTION_ACKNOWLEDE:
|
||||||
|
netspool_acknowlede(&state.netspool);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -429,6 +464,24 @@ int p_tx_readfile(char *buffer, size_t buflen, s_protinfo *pi)
|
|||||||
struct stat st;
|
struct stat st;
|
||||||
long ftell_pos;
|
long ftell_pos;
|
||||||
|
|
||||||
|
#ifdef NETSPOOL
|
||||||
|
if(pi->send->fname==NULL && strcmp(pi->send->localname, "NETSPOOL")==0 ) {
|
||||||
|
if( state->state != NS_RECVFILE ) {
|
||||||
|
log("send: wrong netspool state");
|
||||||
|
pi->send->status = FSTAT_SKIPPED;
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
n = netspool_read(&state.netspool, buffer, buflen);
|
||||||
|
pi->send->eofseen = state.netspool.length == 0;
|
||||||
|
if( n==-1 ) {
|
||||||
|
log("send: netspool error");
|
||||||
|
log(netspool->state->error);
|
||||||
|
pi->send->status = FSTAT_SKIPPED;
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
/*
|
/*
|
||||||
* Sanity check: read from closed file.
|
* Sanity check: read from closed file.
|
||||||
*/
|
*/
|
||||||
@ -1223,6 +1276,10 @@ void p_session_cleanup(s_protinfo *pi, bool success)
|
|||||||
logerr("cannot unlink temporary file \"%s\"", ptrl->fname);
|
logerr("cannot unlink temporary file \"%s\"", ptrl->fname);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef NETSPOOL
|
||||||
|
netspool_end(&state.netspool);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
Loading…
x
Reference in New Issue
Block a user