View | Details | Raw Unified
Collapse All | Expand All

(-) obexftp-0.19/multicobex/multi_cobex.c (-11 / +33 lines)
 Lines 126-132   int cobex_disconnect(obex_t *self, void Link Here 
/* Called from OBEX-lib when data needs to be written */
/* Called from OBEX-lib when data needs to be written */
int cobex_write(obex_t *self, void *data, uint8_t *buffer, int length)
int cobex_write(obex_t *self, void *data, uint8_t *buffer, int length)
{
{
	int actual;
	int written;
	cobex_t *c;
	cobex_t *c;
        return_val_if_fail (self != NULL, -1);
        return_val_if_fail (self != NULL, -1);
        return_val_if_fail (data != NULL, -1);
        return_val_if_fail (data != NULL, -1);
 Lines 137-160   int cobex_write(obex_t *self, void *data Link Here 
	DEBUG(3, "%s() Data %d bytes\n", __func__, length);
	DEBUG(3, "%s() Data %d bytes\n", __func__, length);
	if (c->type == CT_ERICSSON || c->type == CT_SIEMENS) {
	if (c->type == CT_ERICSSON || c->type == CT_SIEMENS) {
		actual = write(c->fd, buffer, length);
		written = write(c->fd, buffer, length);
		if (actual < length)	{
        if (written < length)
			DEBUG(1, "Error writing to port (%d expected %d)\n", actual, length);
        {
			return actual; /* or -1? */
            DEBUG(1, "Error writing to port: %d written, expected %d; retrying...\n", written, length);
            int i, retval=-1, oldretval, fail = 0;
            for (i = 0;written < length;++i)
            {
                usleep(1); // This mysteriously avoids a resource not available error on write()
                oldretval = retval;
                retval = write(c->fd, buffer+written, length-written);
                if (retval < 0)
                {
                    DEBUG(1, "%sError writing to port: %s\n", oldretval>=0?"\n":"",strerror(errno));
                    ++fail;
                    if (fail == 100) // to avoid infinite looping if something is really wrong
                    {
                        return written;
                    }
                }
                else
                {
                    written += retval;
                    DEBUG(1, "Wrote %d bytes out of %d in %d retries%s\r", written,length, i+1, written==length?" - success!\n":"");
                }
            }
		}
		}
		return actual;
		return written;
	}
	}
	if (c->seq == 0){
	if (c->seq == 0){
		actual = bfb_send_first(c->fd, buffer, length);
		written = bfb_send_first(c->fd, buffer, length);
		DEBUG(2, "%s() Wrote %d first packets (%d bytes)\n", __func__, actual, length);
		DEBUG(2, "%s() Wrote %d first packets (%d bytes)\n", __func__, written, length);
	} else {
	} else {
		actual = bfb_send_next(c->fd, buffer, length, c->seq);
		written = bfb_send_next(c->fd, buffer, length, c->seq);
		DEBUG(2, "%s() Wrote %d packets (%d bytes)\n", __func__, actual, length);
		DEBUG(2, "%s() Wrote %d packets (%d bytes)\n", __func__, written, length);
	}
	}
	c->seq++;
	c->seq++;
	return actual;
	return written;
}
}
/* Called when input data is needed */
/* Called when input data is needed */