static char **argv = NULL;
#endif /* TRU64 */
+#define AFP_LISTENERS 32
+#define FDSET_SAFETY 5
+
unsigned char nologin = 0;
struct afp_options default_options;
static AFPConfig *configs;
for (config = configs; config; config = config->next) {
if (config->fd < 0) /* for proxies */
continue;
- fdset_add_fd(&fdset, &polldata, &fdset_used, &fdset_size, config->fd, LISTEN_FD, config);
+ fdset_add_fd(default_options.connections + AFP_LISTENERS + FDSET_SAFETY,
+ &fdset,
+ &polldata,
+ &fdset_used,
+ &fdset_size,
+ config->fd,
+ LISTEN_FD,
+ config);
}
if (default_options.flags & OPTION_KEEPSESSIONS)
- fdset_add_fd(&fdset, &polldata, &fdset_used, &fdset_size, disasociated_ipc_fd, DISASOCIATED_IPC_FD, NULL);
+ fdset_add_fd(default_options.connections + AFP_LISTENERS + FDSET_SAFETY,
+ &fdset,
+ &polldata,
+ &fdset_used,
+ &fdset_size,
+ disasociated_ipc_fd,
+ DISASOCIATED_IPC_FD,
+ NULL);
}
static void fd_reset_listening_sockets(void)
/* config->server_start is afp_config.c:dsi_start() for DSI */
if (child = config->server_start(config, configs, server_children)) {
/* Add IPC fd to select fd set */
- fdset_add_fd(&fdset, &polldata, &fdset_used, &fdset_size, child->ipc_fds[0], IPC_FD, child);
+ fdset_add_fd(default_options.connections + AFP_LISTENERS + FDSET_SAFETY,
+ &fdset,
+ &polldata,
+ &fdset_used,
+ &fdset_size,
+ child->ipc_fds[0],
+ IPC_FD,
+ child);
}
break;
break;
}
child->disasociated = 1;
- fdset_add_fd(&fdset, &polldata, &fdset_used, &fdset_size, fd[0], IPC_FD, child);
+ fdset_add_fd(default_options.connections + AFP_LISTENERS + FDSET_SAFETY,
+ &fdset,
+ &polldata,
+ &fdset_used,
+ &fdset_size,
+ fd[0],
+ IPC_FD,
+ child);
break;
default:
return ret;
}
-#define POLL_FD_SET_STARTSIZE 512
-#define POLL_FD_SET_INCREASE 128
/*!
* Add a fd to a dynamic pollfd array that is allocated and grown as needed
*
* This uses an additional array of struct polldata which stores type information
* (enum fdtype) and a pointer to anciliary user data.
*
- * 1. Allocate the arrays with an intial size of [POLL_FD_SET_STARTSIZE] if
- * *fdsetp is NULL.
- * 2. Grow array as needed
- * 3. Fill in both array elements and increase count of used elements
+ * 1. Allocate the arrays with the size of "maxconns" if *fdsetp is NULL.
+ * 2. Fill in both array elements and increase count of used elements
*
+ * @param maxconns (r) maximum number of connections, determines array size
* @param fdsetp (rw) pointer to callers pointer to the pollfd array
* @param polldatap (rw) pointer to callers pointer to the polldata array
* @param fdset_usedp (rw) pointer to an int with the number of used elements
* @param fdtype (r) type of fd, currently IPC_FD or LISTEN_FD
* @param data (rw) pointer to data the caller want to associate with an fd
*/
-void fdset_add_fd(struct pollfd **fdsetp,
+void fdset_add_fd(int maxconns,
+ struct pollfd **fdsetp,
struct polldata **polldatap,
int *fdset_usedp,
int *fdset_sizep,
LOG(log_debug, logtype_default, "fdset_add_fd: adding fd %i in slot %i", fd, *fdset_usedp);
if (fdset == NULL) { /* 1 */
- /* Initialize with space for 512 fds */
- fdset = calloc(POLL_FD_SET_STARTSIZE, sizeof(struct pollfd));
+ /* Initialize with space for all possibly active fds */
+ fdset = calloc(maxconns, sizeof(struct pollfd));
if (! fdset)
exit(EXITERR_SYS);
- polldata = calloc(POLL_FD_SET_STARTSIZE, sizeof(struct polldata));
+ polldata = calloc(maxconns, sizeof(struct polldata));
if (! polldata)
exit(EXITERR_SYS);
- fdset_size = 512;
- *fdset_sizep = fdset_size;
- *fdsetp = fdset;
- *polldatap = polldata;
- }
-
- if (*fdset_usedp >= fdset_size) { /* 2 */
- fdset = realloc(fdset, sizeof(struct pollfd) * (fdset_size + POLL_FD_SET_INCREASE));
- if (fdset == NULL)
- exit(EXITERR_SYS);
-
- polldata = realloc(polldata, sizeof(struct polldata) * (fdset_size + POLL_FD_SET_INCREASE));
- if (polldata == NULL)
- exit(EXITERR_SYS);
+ fdset_size = maxconns;
- fdset_size += POLL_FD_SET_INCREASE;
*fdset_sizep = fdset_size;
*fdsetp = fdset;
*polldatap = polldata;
}
- /* 3 */
+ /* 2 */
fdset[*fdset_usedp].fd = fd;
fdset[*fdset_usedp].events = POLLIN;
polldata[*fdset_usedp].fdtype = fdtype;