/*
- * Copyright (C) 2005-2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2005-2009 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
* Close the file descriptor given by \a sc, remove it from the close-on-fork
* list, destroy the chunk queue of this client, delete the client from the
* list of connected clients and free the sender_client struct.
+ *
+ * \sa shutdown_clients().
*/
void shutdown_client(struct sender_client *sc, struct sender_status *ss)
{
ss->num_clients--;
}
-void shutdown_clients(struct sender_status *ss)
-{
- struct sender_client *sc, *tmp;
- list_for_each_entry_safe(sc, tmp, &ss->client_list, node)
- shutdown_client(sc, ss);
-}
-
/**
- * Write a buffer to a non-blocking file descriptor.
- *
- * \param fd The file descriptor.
- * \param buf the buffer to write.
- * \param len the number of bytes of \a buf.
- * \param max_bytes_per_write Do not write more than that many bytes at once.
- *
- * If \a max_bytes_per_write is non-zero, do not send more than that many bytes
- * per write().
+ * Shut down all clients connected to a paraslash sender.
*
- * EAGAIN is not considered an error condition. For example CCID3 has a
- * sending wait queue which fills up and is emptied asynchronously. The EAGAIN
- * case means that there is currently no space in the wait queue, but this can
- * change at any moment.
+ * \param ss The sender whose clients are to be shut down.
*
- * \return Negative on errors, number of bytes written else.
+ * This just loops over all connected clients and calls shutdown_client()
+ * for each client.
*/
-static int write_nonblock(int fd, const char *buf, size_t len,
- size_t max_bytes_per_write)
+void shutdown_clients(struct sender_status *ss)
{
- size_t written = 0;
- int ret = 0;
-
- while (written < len) {
- size_t num = len - written;
-
- if (max_bytes_per_write && max_bytes_per_write < num)
- num = max_bytes_per_write;
- ret = write(fd, buf + written, num);
- if (ret < 0 && errno == EAGAIN)
- return written;
- if (ret < 0)
- return -ERRNO_TO_PARA_ERROR(errno);
- written += ret;
- }
- return written;
+ struct sender_client *sc, *tmp;
+ list_for_each_entry_safe(sc, tmp, &ss->client_list, node)
+ shutdown_client(sc, ss);
}
static int queue_chunk_or_shutdown(struct sender_client *sc,