[asterisk-commits] irroot: branch irroot/app_queue_skill r343008 - in /team/irroot/app_queue_ski...
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Wed Nov 2 09:21:34 CDT 2011
Author: irroot
Date: Wed Nov 2 09:21:29 2011
New Revision: 343008
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=343008
Log:
Initialized merge tracking via "svnmerge" with revisions "1-322064" from
https://origsvn.digium.com/svn/asterisk/trunk
Modified:
team/irroot/app_queue_skill/ (props changed)
team/irroot/app_queue_skill/channels/chan_sip.c
team/irroot/app_queue_skill/pbx/pbx_spool.c
Propchange: team/irroot/app_queue_skill/
('svnmerge-integrated' removed)
Modified: team/irroot/app_queue_skill/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/team/irroot/app_queue_skill/channels/chan_sip.c?view=diff&rev=343008&r1=343007&r2=343008
==============================================================================
--- team/irroot/app_queue_skill/channels/chan_sip.c (original)
+++ team/irroot/app_queue_skill/channels/chan_sip.c Wed Nov 2 09:21:29 2011
@@ -1448,7 +1448,7 @@
static void realtime_update_peer(const char *peername, struct ast_sockaddr *addr, const char *username, const char *fullcontact, const char *useragent, int expirey, unsigned short deprecated_username, int lastms);
static void update_peer(struct sip_peer *p, int expire);
static struct ast_variable *get_insecure_variable_from_config(struct ast_config *config);
-static const char *get_name_from_variable(struct ast_variable *var, const char *newpeername);
+static const char *get_name_from_variable(const struct ast_variable *var);
static struct sip_peer *realtime_peer(const char *peername, struct ast_sockaddr *sin, int devstate_only, int which_objects);
static char *sip_prune_realtime(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
@@ -4666,14 +4666,207 @@
return var;
}
-static const char *get_name_from_variable(struct ast_variable *var, const char *newpeername)
-{
- struct ast_variable *tmp;
+static struct ast_variable *get_insecure_variable_from_sippeers(const char *column, const char *value)
+{
+ struct ast_config *peerlist;
+ struct ast_variable *var = NULL;
+ if ((peerlist = ast_load_realtime_multientry("sippeers", column, value, "insecure LIKE", "%port%", SENTINEL))) {
+ if ((var = get_insecure_variable_from_config(peerlist))) {
+ /* Must clone, because var will get freed along with
+ * peerlist. */
+ var = ast_variables_dup(var);
+ }
+ ast_config_destroy(peerlist);
+ }
+ return var;
+}
+
+/* Yes.. the only column that makes sense to pass is "ipaddr", but for
+ * consistency's sake, we require the column name to be passed. As extra
+ * argument, we take a pointer to var. We already got the info, so we better
+ * return it and save the caller a query. If return value is nonzero, then *var
+ * is nonzero too (and the other way around). */
+static struct ast_variable *get_insecure_variable_from_sipregs(const char *column, const char *value, struct ast_variable **var)
+{
+ struct ast_variable *varregs = NULL;
+ struct ast_config *regs, *peers;
+ char *regscat;
+ const char *regname;
+
+ if (!(regs = ast_load_realtime_multientry("sipregs", column, value, SENTINEL))) {
+ return NULL;
+ }
+
+ /* Load *all* peers that are probably insecure=port */
+ if (!(peers = ast_load_realtime_multientry("sippeers", "insecure LIKE", "%port%", SENTINEL))) {
+ ast_config_destroy(regs);
+ return NULL;
+ }
+
+ /* Loop over the sipregs that match IP address and attempt to find an
+ * insecure=port match to it in sippeers. */
+ regscat = NULL;
+ while ((regscat = ast_category_browse(regs, regscat)) && (regname = ast_variable_retrieve(regs, regscat, "name"))) {
+ char *peerscat;
+ const char *peername;
+
+ peerscat = NULL;
+ while ((peerscat = ast_category_browse(peers, peerscat)) && (peername = ast_variable_retrieve(peers, peerscat, "name"))) {
+ if (!strcasecmp(regname, peername)) {
+ /* Ensure that it really is insecure=port and
+ * not something else. */
+ const char *insecure = ast_variable_retrieve(peers, peerscat, "insecure");
+ struct ast_flags flags = {0};
+ set_insecure_flags(&flags, insecure, -1);
+ if (ast_test_flag(&flags, SIP_INSECURE_PORT)) {
+ /* ENOMEM checks till the bitter end. */
+ if ((varregs = ast_variables_dup(ast_category_root(regs, regscat)))) {
+ if (!(*var = ast_variables_dup(ast_category_root(peers, peerscat)))) {
+ ast_variables_destroy(varregs);
+ varregs = NULL;
+ }
+ }
+ goto done;
+ }
+ }
+ }
+ }
+
+done:
+ ast_config_destroy(regs);
+ ast_config_destroy(peers);
+ return varregs;
+}
+
+static const char *get_name_from_variable(const struct ast_variable *var)
+{
+ const struct ast_variable *tmp;
for (tmp = var; tmp; tmp = tmp->next) {
- if (!newpeername && !strcasecmp(tmp->name, "name"))
- newpeername = tmp->value;
- }
- return newpeername;
+ if (!strcasecmp(tmp->name, "name")) {
+ return tmp->value;
+ }
+ }
+ return NULL;
+}
+
+/* If varregs is NULL, we don't use sipregs.
+ * Using empty if-bodies instead of goto's while avoiding unnecessary indents */
+static int realtime_peer_by_name(const char *const *name, struct ast_sockaddr *addr, const char *ipaddr, struct ast_variable **var, struct ast_variable **varregs)
+{
+ /* Peer by name and host=dynamic */
+ if ((*var = ast_load_realtime("sippeers", "name", *name, "host", "dynamic", SENTINEL))) {
+ ;
+ /* Peer by name and host=IP */
+ } else if (addr && !(*var = ast_load_realtime("sippeers", "name", *name, "host", ipaddr, SENTINEL))) {
+ ;
+ /* Peer by name and host=HOSTNAME */
+ } else if ((*var = ast_load_realtime("sippeers", "name", *name, SENTINEL))) {
+ /*!\note
+ * If this one loaded something, then we need to ensure that the host
+ * field matched. The only reason why we can't have this as a criteria
+ * is because we only have the IP address and the host field might be
+ * set as a name (and the reverse PTR might not match).
+ */
+ if (addr) {
+ struct ast_variable *tmp;
+ for (tmp = *var; tmp; tmp = tmp->next) {
+ if (!strcasecmp(tmp->name, "host")) {
+ struct ast_sockaddr *addrs = NULL;
+
+ if (ast_sockaddr_resolve(&addrs,
+ tmp->value,
+ PARSE_PORT_FORBID,
+ get_address_family_filter(&bindaddr)) <= 0 ||
+ ast_sockaddr_cmp(&addrs[0], addr)) {
+ /* No match */
+ ast_variables_destroy(*var);
+ *var = NULL;
+ }
+ ast_free(addrs);
+ break;
+ }
+ }
+ }
+ }
+
+ /* Did we find anything? */
+ if (*var) {
+ if (varregs) {
+ *varregs = ast_load_realtime("sipregs", "name", *name, SENTINEL);
+ }
+ return 1;
+ }
+ return 0;
+}
+
+/* Another little helper function for backwards compatibility: this
+ * checks/fetches the sippeer that belongs to the sipreg. If none is
+ * found, we free the sipreg and return false. This way we can do the
+ * check inside the if-condition below. In the old code, not finding
+ * the sippeer also had it continue look for another match, so we do
+ * the same. */
+static struct ast_variable *realtime_peer_get_sippeer_helper(const char **name, struct ast_variable **varregs) {
+ struct ast_variable *var;
+ const char *old_name = *name;
+ *name = get_name_from_variable(*varregs);
+ if (!(var = ast_load_realtime("sippeers", "name", *name, SENTINEL))) {
+ ast_variables_destroy(*varregs);
+ *varregs = NULL;
+ *name = old_name;
+ }
+ return var;
+}
+
+/* If varregs is NULL, we don't use sipregs. If we return true, then *name is
+ * set. Using empty if-bodies instead of goto's while avoiding unnecessary
+ * indents. */
+static int realtime_peer_by_addr(const char **name, struct ast_sockaddr *addr, const char *ipaddr, struct ast_variable **var, struct ast_variable **varregs)
+{
+ char portstring[6]; /* up to 5 digits plus null terminator */
+ ast_copy_string(portstring, ast_sockaddr_stringify_port(addr), sizeof(portstring));
+
+ /* We're not finding this peer by this name anymore. Reset it. */
+ *name = NULL;
+
+ /* First check for fixed IP hosts */
+ if ((*var = ast_load_realtime("sippeers", "host", ipaddr, "port", portstring, SENTINEL))) {
+ ;
+ /* Check for registered hosts (in sipregs) */
+ } else if (varregs && (*varregs = ast_load_realtime("sipregs", "ipaddr", ipaddr, "port", portstring, SENTINEL)) &&
+ (*var = realtime_peer_get_sippeer_helper(name, varregs))) {
+ ;
+ /* Check for registered hosts (in sippeers) */
+ } else if (!varregs && (*var = ast_load_realtime("sippeers", "ipaddr", ipaddr, "port", portstring, SENTINEL))) {
+ ;
+ /* We couldn't match on ipaddress and port, so we need to check if port is insecure */
+ } else if ((*var = get_insecure_variable_from_sippeers("host", ipaddr))) {
+ ;
+ /* Same as above, but try the IP address field (in sipregs)
+ * Observe that it fetches the name/var at the same time, without the
+ * realtime_peer_get_sippeer_helper. Also note that it is quite inefficient.
+ * Avoid sipregs if possible. */
+ } else if (varregs && (*varregs = get_insecure_variable_from_sipregs("ipaddr", ipaddr, var))) {
+ ;
+ /* Same as above, but try the IP address field (in sippeers) */
+ } else if (!varregs && (*var = get_insecure_variable_from_sippeers("ipaddr", ipaddr))) {
+ ;
+ }
+
+ /* Did we find anything? */
+ if (*var) {
+ /* Make sure name is populated. */
+ if (!*name) {
+ *name = get_name_from_variable(*var);
+ }
+ /* Make sure varregs is populated if var is. Ensuring
+ * that var is set when varregs is, is taken care of by
+ * realtime_peer_get_sippeer_helper(). */
+ if (varregs && !*varregs) {
+ *varregs = ast_load_realtime("sipregs", "name", *name, SENTINEL);
+ }
+ return 1;
+ }
+ return 0;
}
/*! \brief realtime_peer: Get peer from realtime storage
@@ -4681,162 +4874,48 @@
* Checks the "sipregs" realtime family from extconfig.conf if it's configured.
* This returns a pointer to a peer and because we use build_peer, we can rest
* assured that the refcount is bumped.
-*/
+ *
+ * \note This is never called with both newpeername and addr at the same time.
+ * If you do, be prepared to get a peer with a different name than newpeername.
+ */
static struct sip_peer *realtime_peer(const char *newpeername, struct ast_sockaddr *addr, int devstate_only, int which_objects)
{
- struct sip_peer *peer;
+ struct sip_peer *peer = NULL;
struct ast_variable *var = NULL;
struct ast_variable *varregs = NULL;
- struct ast_variable *tmp;
- struct ast_config *peerlist = NULL;
char ipaddr[INET6_ADDRSTRLEN];
- char portstring[6]; /*up to 5 digits plus null terminator*/
int realtimeregs = ast_check_realtime("sipregs");
- /* First check on peer name */
- if (newpeername) {
- if (realtimeregs)
- varregs = ast_load_realtime("sipregs", "name", newpeername, SENTINEL);
-
- var = ast_load_realtime("sippeers", "name", newpeername, "host", "dynamic", SENTINEL);
- if (!var && addr) {
- var = ast_load_realtime("sippeers", "name", newpeername, "host", ast_sockaddr_stringify_addr(addr), SENTINEL);
- }
- if (!var) {
- var = ast_load_realtime("sippeers", "name", newpeername, SENTINEL);
- /*!\note
- * If this one loaded something, then we need to ensure that the host
- * field matched. The only reason why we can't have this as a criteria
- * is because we only have the IP address and the host field might be
- * set as a name (and the reverse PTR might not match).
- */
- if (var && addr) {
- for (tmp = var; tmp; tmp = tmp->next) {
- if (!strcasecmp(tmp->name, "host")) {
- struct ast_sockaddr *addrs = NULL;
-
- if (ast_sockaddr_resolve(&addrs,
- tmp->value,
- PARSE_PORT_FORBID,
- get_address_family_filter(&bindaddr)) <= 0 ||
- ast_sockaddr_cmp(&addrs[0], addr)) {
- /* No match */
- ast_variables_destroy(var);
- var = NULL;
- }
- ast_free(addrs);
- break;
- }
- }
- }
- }
- }
-
- if (!var && addr) { /* Then check on IP address for dynamic peers */
+ if (addr) {
ast_copy_string(ipaddr, ast_sockaddr_stringify_addr(addr), sizeof(ipaddr));
- ast_copy_string(portstring, ast_sockaddr_stringify_port(addr), sizeof(portstring));
- var = ast_load_realtime("sippeers", "host", ipaddr, "port", portstring, SENTINEL); /* First check for fixed IP hosts */
- if (var) {
- if (realtimeregs) {
- newpeername = get_name_from_variable(var, newpeername);
- varregs = ast_load_realtime("sipregs", "name", newpeername, SENTINEL);
- }
- } else {
- if (realtimeregs)
- varregs = ast_load_realtime("sipregs", "ipaddr", ipaddr, "port", portstring, SENTINEL); /* Then check for registered hosts */
- else
- var = ast_load_realtime("sippeers", "ipaddr", ipaddr, "port", portstring, SENTINEL); /* Then check for registered hosts */
- if (varregs) {
- newpeername = get_name_from_variable(varregs, newpeername);
- var = ast_load_realtime("sippeers", "name", newpeername, SENTINEL);
- }
- }
- if (!var) { /*We couldn't match on ipaddress and port, so we need to check if port is insecure*/
- peerlist = ast_load_realtime_multientry("sippeers", "host", ipaddr, SENTINEL);
- if (peerlist) {
- var = get_insecure_variable_from_config(peerlist);
- if(var) {
- if (realtimeregs) {
- newpeername = get_name_from_variable(var, newpeername);
- varregs = ast_load_realtime("sipregs", "name", newpeername, SENTINEL);
- }
- } else { /*var wasn't found in the list of "hosts", so try "ipaddr"*/
- peerlist = NULL;
- peerlist = ast_load_realtime_multientry("sippeers", "ipaddr", ipaddr, SENTINEL);
- if(peerlist) {
- var = get_insecure_variable_from_config(peerlist);
- if(var) {
- if (realtimeregs) {
- newpeername = get_name_from_variable(var, newpeername);
- varregs = ast_load_realtime("sipregs", "name", newpeername, SENTINEL);
- }
- }
- }
- }
- } else {
- if (realtimeregs) {
- peerlist = ast_load_realtime_multientry("sipregs", "ipaddr", ipaddr, SENTINEL);
- if (peerlist) {
- varregs = get_insecure_variable_from_config(peerlist);
- if (varregs) {
- newpeername = get_name_from_variable(varregs, newpeername);
- var = ast_load_realtime("sippeers", "name", newpeername, SENTINEL);
- }
- }
- } else {
- peerlist = ast_load_realtime_multientry("sippeers", "ipaddr", ipaddr, SENTINEL);
- if (peerlist) {
- var = get_insecure_variable_from_config(peerlist);
- if (var) {
- newpeername = get_name_from_variable(var, newpeername);
- varregs = ast_load_realtime("sipregs", "name", newpeername, SENTINEL);
- }
- }
- }
- }
- }
- }
-
- if (!var) {
- if (peerlist)
- ast_config_destroy(peerlist);
+ } else {
+ ipaddr[0] = '\0';
+ }
+
+ if (newpeername && realtime_peer_by_name(&newpeername, addr, ipaddr, &var, realtimeregs ? &varregs : NULL)) {
+ ;
+ } else if (addr && realtime_peer_by_addr(&newpeername, addr, ipaddr, &var, realtimeregs ? &varregs : NULL)) {
+ ;
+ } else {
+ ast_log(LOG_WARNING, "Cannot Determine peer name ip=%s\n", ipaddr);
return NULL;
}
- for (tmp = var; tmp; tmp = tmp->next) {
- if (!strcasecmp(tmp->name, "type") && (!strcasecmp(tmp->value, "peer") && which_objects == FINDUSERS)) {
- if (peerlist) {
- ast_config_destroy(peerlist);
- } else {
- ast_variables_destroy(var);
- ast_variables_destroy(varregs);
- }
- return NULL;
- } else if (!newpeername && !strcasecmp(tmp->name, "name")) {
- newpeername = tmp->value;
- }
- }
-
- if (!newpeername) { /* Did not find peer in realtime */
- ast_log(LOG_WARNING, "Cannot Determine peer name ip=%s\n", ipaddr);
- if(peerlist)
- ast_config_destroy(peerlist);
- else
- ast_variables_destroy(var);
- return NULL;
- }
-
+ /* If we're looking for users, don't return peers (although this check
+ * should probably be done in realtime_peer_by_* instead...) */
+ if (which_objects == FINDUSERS) {
+ struct ast_variable *tmp;
+ for (tmp = var; tmp; tmp = tmp->next) {
+ if (!strcasecmp(tmp->name, "type") && (!strcasecmp(tmp->value, "peer"))) {
+ goto cleanup;
+ }
+ }
+ }
/* Peer found in realtime, now build it in memory */
peer = build_peer(newpeername, var, varregs, TRUE, devstate_only);
if (!peer) {
- if(peerlist)
- ast_config_destroy(peerlist);
- else {
- ast_variables_destroy(var);
- ast_variables_destroy(varregs);
- }
- return NULL;
+ goto cleanup;
}
ast_debug(3, "-REALTIME- loading peer from database to memory. Name: %s. Peer objects: %d\n", peer->name, rpeerobjs);
@@ -4856,13 +4935,10 @@
}
}
peer->is_realtime = 1;
- if (peerlist)
- ast_config_destroy(peerlist);
- else {
- ast_variables_destroy(var);
- ast_variables_destroy(varregs);
- }
-
+
+cleanup:
+ ast_variables_destroy(var);
+ ast_variables_destroy(varregs);
return peer;
}
@@ -26401,7 +26477,7 @@
return -1;
}
peer->call = dialog_ref(p, "copy sip alloc from p to peer->call");
-
+
p->sa = peer->addr;
p->recv = peer->addr;
copy_socket_data(&p->socket, &peer->socket);
@@ -26410,13 +26486,19 @@
ast_copy_flags(&p->flags[2], &peer->flags[2], SIP_PAGE3_FLAGS_TO_COPY);
/* Send OPTIONs to peer's fullcontact */
- if (!ast_strlen_zero(peer->fullcontact))
+ if (!ast_strlen_zero(peer->fullcontact)) {
ast_string_field_set(p, fullcontact, peer->fullcontact);
-
- if (!ast_strlen_zero(peer->tohost))
+ }
+
+ if (!ast_strlen_zero(peer->fromuser)) {
+ ast_string_field_set(p, fromuser, peer->fromuser);
+ }
+
+ if (!ast_strlen_zero(peer->tohost)) {
ast_string_field_set(p, tohost, peer->tohost);
- else
+ } else {
ast_string_field_set(p, tohost, ast_sockaddr_stringify_host_remote(&peer->addr));
+ }
/* Recalculate our side, and recalculate Call ID */
ast_sip_ouraddrfor(&p->sa, &p->ourip, p);
Modified: team/irroot/app_queue_skill/pbx/pbx_spool.c
URL: http://svnview.digium.com/svn/asterisk/team/irroot/app_queue_skill/pbx/pbx_spool.c?view=diff&rev=343008&r1=343007&r2=343008
==============================================================================
--- team/irroot/app_queue_skill/pbx/pbx_spool.c (original)
+++ team/irroot/app_queue_skill/pbx/pbx_spool.c Wed Nov 2 09:21:29 2011
@@ -471,6 +471,7 @@
#if defined(HAVE_INOTIFY)
/* Only one thread is accessing this list, so no lock is necessary */
static AST_LIST_HEAD_NOLOCK_STATIC(createlist, direntry);
+static AST_LIST_HEAD_NOLOCK_STATIC(openlist, direntry);
#endif
static void queue_file(const char *filename, time_t when)
@@ -551,14 +552,47 @@
return;
}
strcpy(cur->name, filename);
+ /* We'll handle this file unless an IN_OPEN event occurs within 2 seconds */
+ cur->mtime = time(NULL) + 2;
AST_LIST_INSERT_TAIL(&createlist, cur, list);
+}
+
+static void queue_file_open(const char *filename)
+{
+ struct direntry *cur;
+
+ AST_LIST_TRAVERSE_SAFE_BEGIN(&createlist, cur, list) {
+ if (!strcmp(cur->name, filename)) {
+ AST_LIST_REMOVE_CURRENT(list);
+ AST_LIST_INSERT_TAIL(&openlist, cur, list);
+ break;
+ }
+ }
+ AST_LIST_TRAVERSE_SAFE_END
+}
+
+static void queue_created_files(void)
+{
+ struct direntry *cur;
+ time_t now = time(NULL);
+
+ AST_LIST_TRAVERSE_SAFE_BEGIN(&createlist, cur, list) {
+ if (cur->mtime > now) {
+ break;
+ }
+
+ AST_LIST_REMOVE_CURRENT(list);
+ queue_file(cur->name, 0);
+ ast_free(cur);
+ }
+ AST_LIST_TRAVERSE_SAFE_END
}
static void queue_file_write(const char *filename)
{
struct direntry *cur;
/* Only queue entries where an IN_CREATE preceded the IN_CLOSE_WRITE */
- AST_LIST_TRAVERSE_SAFE_BEGIN(&createlist, cur, list) {
+ AST_LIST_TRAVERSE_SAFE_BEGIN(&openlist, cur, list) {
if (!strcmp(cur->name, filename)) {
AST_LIST_REMOVE_CURRENT(list);
ast_free(cur);
@@ -605,7 +639,7 @@
}
#ifdef HAVE_INOTIFY
- inotify_add_watch(inotify_fd, qdir, IN_CREATE | IN_CLOSE_WRITE | IN_MOVED_TO);
+ inotify_add_watch(inotify_fd, qdir, IN_CREATE | IN_OPEN | IN_CLOSE_WRITE | IN_MOVED_TO);
#endif
/* First, run through the directory and clear existing entries */
@@ -641,14 +675,35 @@
/* Convert from seconds to milliseconds, unless there's nothing
* in the queue already, in which case, we wait forever. */
int waittime = next == INT_MAX ? -1 : (next - now) * 1000;
+ if (!AST_LIST_EMPTY(&createlist)) {
+ waittime = 1000;
+ }
/* When a file arrives, add it to the queue, in mtime order. */
if ((res = poll(&pfd, 1, waittime)) > 0 && (stage = 1) &&
(res = read(inotify_fd, &buf, sizeof(buf))) >= sizeof(*iev)) {
ssize_t len = 0;
/* File(s) added to directory, add them to my list */
for (iev = (void *) buf; res >= sizeof(*iev); iev = (struct inotify_event *) (((char *) iev) + len)) {
+ /* For an IN_MOVED_TO event, simply process the file. However, if
+ * we get an IN_CREATE event it *might* be an open(O_CREAT) or it
+ * might be a hardlink (like smsq does, since rename() might
+ * overwrite an existing file). So we have to see if we get a
+ * subsequent IN_OPEN event on the same file. If we do, keep it
+ * on the openlist and wait for the corresponding IN_CLOSE_WRITE.
+ * If we *don't* see an IN_OPEN event, then it was a hard link so
+ * it can be processed immediately.
+ *
+ * Unfortunately, although open(O_CREAT) is an atomic file system
+ * operation, the inotify subsystem doesn't give it to us in a
+ * single event with both IN_CREATE|IN_OPEN set. It's two separate
+ * events, and the kernel doesn't even give them to us at the same
+ * time. We can read() from inotify_fd after the IN_CREATE event,
+ * and get *nothing* from it. The IN_OPEN arrives only later! So
+ * we have a very short timeout of 2 seconds. */
if (iev->mask & IN_CREATE) {
queue_file_create(iev->name);
+ } else if (iev->mask & IN_OPEN) {
+ queue_file_open(iev->name);
} else if (iev->mask & IN_CLOSE_WRITE) {
queue_file_write(iev->name);
} else if (iev->mask & IN_MOVED_TO) {
@@ -663,6 +718,9 @@
} else if (res < 0 && errno != EINTR && errno != EAGAIN) {
ast_debug(1, "Got an error back from %s(2): %s\n", stage ? "read" : "poll", strerror(errno));
}
+ time(&now);
+ }
+ queue_created_files();
#else
struct timespec ts2 = { next - now, 0 };
if (kevent(inotify_fd, NULL, 0, &kev, 1, &ts2) <= 0) {
@@ -675,9 +733,9 @@
queue_file(de->d_name, 0);
}
}
-#endif
time(&now);
}
+#endif
/* Empty the list of all entries ready to be processed */
AST_LIST_LOCK(&dirlist);
More information about the asterisk-commits
mailing list