[Pkg-voip-commits] [dahdi-tools] 147/285: dahdi_cfg: Wait for all spans to be assigned.

tzafrir at debian.org tzafrir at debian.org
Thu Jul 7 19:18:47 UTC 2016


This is an automated email from the git hooks/post-receive script.

tzafrir pushed a commit to branch master
in repository dahdi-tools.

commit 5ca600c7c79e8d10d63dd2703b3902b4c4548eb5
Author: Shaun Ruffell <sruffell at digium.com>
Date:   Mon Dec 9 17:19:23 2013 -0600

    dahdi_cfg: Wait for all spans to be assigned.
    
    When auto span assignment is disabled, it's possible that simply running
    
      # /etc/init.d/dahdi restart
    
    Will fail since dahdi_cfg can run in parallel with udev scripts that are
    assigning spans, which results in /etc/dahdi/system.conf describing spans that
    do not exist in the system.
    
    This change sets up dahdi_cfg, when run without the -C or -S options, to look in
    sysfs and make sure all spans for each device are assigned.  dahdi_cfg will wait
    5 seconds for span assignment to happen before proceeding normally.
    
    Signed-off-by: Shaun Ruffell <sruffell at digium.com>
    Acked-by: Tzafrir Cohen <tzafrir.cohen at xorcom.com>
    Acked-by: Russ Meyerriecks <rmeyerriecks at digium.com>
---
 dahdi_cfg.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 95 insertions(+)

diff --git a/dahdi_cfg.c b/dahdi_cfg.c
index 349a0af..0de1091 100644
--- a/dahdi_cfg.c
+++ b/dahdi_cfg.c
@@ -36,6 +36,8 @@
 #include <sys/ioctl.h>
 #include <fcntl.h>
 #include <errno.h>
+#include <dirent.h>
+#include <stdbool.h>
 
 #include <dahdi/user.h>
 #include "tonezone.h"
@@ -137,6 +139,84 @@ static const char *laws[] = {
 	"A-law"
 };
 
+static bool _are_all_spans_assigned(const char *device_path)
+{
+	char attribute[1024];
+	int res;
+	FILE *fp;
+	int span_count;
+	DIR *dirp;
+	struct dirent *dirent;
+
+	snprintf(attribute, sizeof(attribute) - 1,
+		 "%s/span_count", device_path);
+	fp = fopen(attribute, "r");
+	if (NULL == fp) {
+		fprintf(stderr, "Failed to open '%s'.\n", attribute);
+		return false;
+	}
+	res = fscanf(fp, "%d", &span_count);
+	fclose(fp);
+
+	if (EOF == res) {
+		fprintf(stderr, "Failed to read '%s'.\n", attribute);
+		return false;
+	}
+
+	dirp = opendir(device_path);
+	while (span_count) {
+		dirent = readdir(dirp);
+		if (NULL == dirent)
+			break;
+		if (!strncmp("span-", dirent->d_name, 5)) {
+			--span_count;
+		}
+	}
+	closedir(dirp);
+	return (span_count > 0) ? false : true;
+}
+
+/**
+ * are_all_spans_assigned - Look in sysfs to see if all spans for a device are assigned.
+ *
+ * Returns true if there are $span_count child spans of all devices, or false
+ *  otherwise.
+ */
+static bool are_all_spans_assigned(void)
+{
+	DIR *dirp;
+	struct dirent *dirent;
+	bool res = true;
+	char device_path[1024];
+
+	dirp = opendir("/sys/bus/dahdi_devices/devices");
+	if (!dirp) {
+		/* If we cannot open dahdi_devices, either dahdi isn't loaded,
+		 * or we're using an older version of DAHDI that doesn't use
+		 * sysfs. */
+		return true;
+	}
+
+	while (true && res) {
+
+		dirent = readdir(dirp);
+		if (NULL == dirent)
+			break;
+
+		if (!strcmp(dirent->d_name, ".") ||
+		    !strcmp(dirent->d_name, ".."))
+			continue;
+
+		snprintf(device_path, sizeof(device_path)-1,
+			 "/sys/bus/dahdi_devices/devices/%s", dirent->d_name);
+		res = _are_all_spans_assigned(device_path);
+	}
+
+	closedir(dirp);
+	errno = 0;
+	return res;
+}
+
 static const char *sigtype_to_str(const int sig)
 {
 	switch (sig) {
@@ -1495,6 +1575,21 @@ int main(int argc, char *argv[])
 		fprintf(stderr, "%s\n", dahdi_tools_version);
 	}
 
+	if (!restrict_channels && !only_span) {
+		bool all_assigned = are_all_spans_assigned();
+		unsigned int timeout = 4*5; /* We'll wait 5 seconds */
+
+		while (!all_assigned && --timeout) {
+			usleep(250000);
+			all_assigned = are_all_spans_assigned();
+		}
+
+		if (0 == timeout) {
+			fprintf(stderr,
+				"Timeout waiting for all spans to be assigned.\n");
+		}
+	}
+
 	if (fd == -1) fd = open(MASTER_DEVICE, O_RDWR);
 	if (fd < 0) {
 		error("Unable to open master device '%s'\n", MASTER_DEVICE);

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-voip/dahdi-tools.git



More information about the Pkg-voip-commits mailing list