Home | History | Annotate | Download | only in src

Lines Matching refs:transfer

22 static void free_transfer(struct tftp_transfer *transfer);
25 static ssize_t get_block(char *packet, struct tftp_transfer *transfer);
52 struct tftp_transfer *transfer;
144 if (!(transfer = whine_malloc(sizeof(struct tftp_transfer))))
147 if ((transfer->sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
149 free(transfer);
153 transfer->peer = peer;
154 transfer->timeout = now + 2;
155 transfer->backoff = 1;
156 transfer->block = 1;
157 transfer->blocksize = 512;
158 transfer->offset = 0;
159 transfer->file = NULL;
160 transfer->opt_blocksize = transfer->opt_transize = 0;
161 transfer->netascii = transfer->carrylf = 0;
166 if (bind(transfer->sockfd, (struct sockaddr *)&addr, sizeof(addr)) == -1 ||
168 setsockopt(transfer->sockfd, SOL_IP, IP_MTU_DISCOVER, &mtuflag, sizeof(mtuflag)) == -1 ||
170 !fix_fd(transfer->sockfd))
181 free_transfer(transfer);
198 transfer->netascii = 1;
207 transfer->blocksize = atoi(opt);
208 if (transfer->blocksize < 1)
209 transfer->blocksize = 1;
210 if (transfer->blocksize > (unsigned)daemon->packet_buff_sz - 4)
211 transfer->blocksize = (unsigned)daemon->packet_buff_sz - 4;
213 if (mtu != 0 && transfer->blocksize > (unsigned)mtu - 32)
214 transfer->blocksize = (unsigned)mtu - 32;
215 transfer->opt_blocksize = 1;
216 transfer->block = 0;
219 else if (strcasecmp(opt, "tsize") == 0 && next(&p, end) && !transfer->netascii)
221 transfer->opt_transize = 1;
222 transfer->block = 0;
266 if ((transfer->file = check_tftp_fileperm(&len)))
268 if ((len = get_block(packet, transfer)) == -1)
275 while (sendto(transfer->sockfd, packet, len, 0,
279 free_transfer(transfer);
283 transfer->next = daemon->tftp_trans;
284 daemon->tftp_trans = transfer;
373 struct tftp_transfer *transfer, *tmp, **up;
381 for (transfer = daemon->tftp_trans, up = &daemon->tftp_trans; transfer; transfer = tmp)
383 tmp = transfer->next;
385 if (FD_ISSET(transfer->sockfd, rset))
390 if ((len = recv(transfer->sockfd, daemon->packet, daemon->packet_buff_sz, 0)) >= (ssize_t)sizeof(struct ack))
392 if (ntohs(mess->op) == OP_ACK && ntohs(mess->block) == (unsigned short)transfer->block)
395 transfer->timeout = now;
396 transfer->backoff = 0;
397 if (transfer->block++ != 0)
398 transfer->offset += transfer->blocksize - transfer->expansion;
418 inet_ntoa(transfer->peer.sin_addr));
421 transfer->timeout = now;
422 transfer->backoff = 100;
427 if (difftime(now, transfer->timeout) >= 0.0)
432 transfer->timeout += 1 + (1<<transfer->backoff);
437 if ((len = get_block(daemon->packet, transfer)) == -1)
439 len = tftp_err_oops(daemon->packet, transfer->file->filename);
442 else if (++transfer->backoff > 5)
448 transfer->file->filename, inet_ntoa(transfer->peer.sin_addr));
453 while(sendto(transfer->sockfd, daemon->packet, len, 0,
454 (struct sockaddr *)&transfer->peer, sizeof(transfer->peer)) == -1 && errno == EINTR);
460 free_transfer(transfer);
465 up = &transfer->next;
469 static void free_transfer(struct tftp_transfer *transfer)
471 close(transfer->sockfd);
472 if (transfer->file && (--transfer->file->refcount) == 0)
474 close(transfer->file->fd);
475 free(transfer->file);
477 free(transfer);
517 static ssize_t get_block(char *packet, struct tftp_transfer *transfer)
519 if (transfer->block == 0)
530 if (transfer->opt_blocksize)
533 p += (sprintf(p, "%d", transfer->blocksize) + 1);
535 if (transfer->opt_transize)
538 p += (sprintf(p, "%u", (unsigned int)transfer->file->size) + 1);
551 size_t size = transfer->file->size - transfer->offset;
553 if (transfer->offset > transfer->file->size)
556 if (size > transfer->blocksize)
557 size = transfer->blocksize;
560 mess->block = htons((unsigned short)(transfer->block));
562 if (lseek(transfer->file->fd, transfer->offset, SEEK_SET) == (off_t)-1 ||
563 !read_write(transfer->file->fd, mess->data, size, 1))
566 transfer->expansion = 0;
569 if (transfer->netascii)
575 if (mess->data[i] == '\n' && ( i != 0 || !transfer->carrylf))
577 if (size == transfer->blocksize)
579 transfer->expansion++;
592 transfer->carrylf = newcarrylf;