Age | Commit message (Collapse) | Author |
|
|
|
This also sends a broadcast to all friends you went offline,
leading to an immediate event-feedback.
|
|
Remove ugly casts.
|
|
dirfd should be the first arg to be consistent with other
functions.
|
|
Put the error-strings in one single data-structure and flush the err-file
every time before a new incoming request, so it's empty when the request
succeeds.
|
|
fiforead() automatically reopens a file-descriptor in case
it returns EOF (return 0).
It returns -1 on error.
|
|
|
|
Also flush the fifo for stalled transfers
|
|
The OUT_F-type was not clear. Make it easier to see the out-file
has no state (=NONE) and is defined for each slot individually.
Moreover, in the initial creation, the err-file fell through
just because STATIC = 0 and .outfile wasn't defined for it.
It was only coincidence this worked and now we have a much
more bulletproof implementation.
|
|
|
|
The doc lies, if the receiver resumes a transfer you get
a control packet with send_receive == 1 and control_type == TOX_FILECONTROL_ACCEPT.
We keep state locally and move from PAUSED to INPROGRESS when the
above happens.
|
|
Doesn't quite work yet though.
|
|
|
|
Just re-open them to clear EOF.
|
|
O_RDWR is a dirty hack to get around the issue of infinite
EOFs while reading an in-FIFO.
Instead, stop breaking POSIX and set the FIFOs to O_RDONLY.
In case a read returns EOF (r == 0), we reopen the fd.
Same will be applied to the friend-fifos (especially file_in),
helping us get rid of strange timeouts and heuristics and
rather solve the problem the POSIX-way.
The only downside to this is that we are blind for writes
to the in-FIFOs between catching read == 0 and close(), but this is
not an issue.
To make reopening as easy as possible, I added a dirfd
to all slots.
While at it, I changed the initial setup and removed the chdir()
in favor of the POSIX-2008-compliant *at-functions.
This lets us do stuff without having to use snprintf to build
paths and is more bulletproof even in case the directory is
renamed.
|
|
|
|
|
|
or FOLDER
So use STATIC here.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
For aborted transfers, we will have to move the transfer to the
TRANSFER_KILLED state. Then we'll have to wait until the input
FIFO stops being readable (the user ^C the transfer). Only then can
we move to TRANSFER_NONE.
If we move to TRANSFER_NONE immediately then we will initiate a
new transfer which we don't want to do.
The basic idea is:
If we move into the TRANSFER_KILLED state and timeout has expired (50ms?)
without the fd being readable (the user did a ^C on cat file > file_in)
then move the transfer to TRANSFER_NONE state.
|
|
|
|
|
|
Makes it a bit more difficult to accidentally delete it and the
user can't really interact with it so make it hidden.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
We will gradually expose the other commands as well.
|
|
|
|
|
|
|
|
Side-effect: If you send a file to a friend that is offline,
the write will block() until the friend comes online at which point
the file transfer will begin.
|
|
|