int cb_tftp_rx(struct pico_tftp_session *session, uint16_t event, uint8_t *block, int32_t len, void *arg) { struct note_t *note = (struct note_t *) arg; int ret; if (event != PICO_TFTP_EV_OK) { fprintf(stderr, "TFTP: Error %" PRIu16 ": %s\n", event, block); exit(1); } if (!note) return 0; note->filesize += len; if (write(note->fd, block, len) < 0) { perror("write"); fprintf(stderr, "Filesystem error writing file %s, cancelling current transfer\n", note->filename); pico_tftp_abort(session, TFTP_ERR_EACC, "Error on write"); del_note(note); } else { if (len != PICO_TFTP_PAYLOAD_SIZE) { printf("TFTP: file %s (%" PRId32 " bytes) RX transfer complete!\n", note->filename, note->filesize); close(note->fd); del_note(note); } } if (!clipboard) pico_timer_add(3000, deferred_exit, NULL); return len; }
int cb_tftp_tx(struct pico_tftp_session *session, uint16_t event, uint8_t *block, int32_t len, void *arg) { struct note_t *note = (struct note_t *) arg; if (event != PICO_TFTP_EV_OK) { fprintf(stderr, "TFTP: Error %" PRIu16 ": %s\n", event, block); exit(1); } len = read(note->fd, tftp_txbuf, PICO_TFTP_PAYLOAD_SIZE); if (len >= 0) { note->filesize += len; pico_tftp_send(session, tftp_txbuf, len); if (len < PICO_TFTP_PAYLOAD_SIZE) { printf("TFTP: file %s (%" PRId32 " bytes) TX transfer complete!\n", note->filename, note->filesize); close(note->fd); del_note(note); } } else { perror("read"); fprintf(stderr, "Filesystem error reading file %s, cancelling current transfer\n", note->filename); pico_tftp_abort(session, TFTP_ERR_EACC, "Error on read"); del_note(note); } if (!clipboard) pico_timer_add(3000, deferred_exit, NULL); return len; }
END_TEST START_TEST(tc_pico_tftp_abort) { int ret; listen_socket = NULL; /*first case: no session and no listening socket*/ ret = pico_tftp_abort(NULL); fail_if(ret != -1); /*second case: no session but listening socket*/ listen_socket = example_session.socket = &example_socket; pico_tftp_abort(NULL); fail_if(ret != -1); /*tirdh case: session non into list*/ ret = pico_tftp_abort(&example_session); fail_if(ret != -1); }