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@digium.com> Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com> Acked-by: Russ Meyerriecks <rmeyerriecks@digium.com>
This commit is contained in:
parent
98736e1add
commit
5ca600c7c7
95
dahdi_cfg.c
95
dahdi_cfg.c
@ -36,6 +36,8 @@
|
|||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include <dahdi/user.h>
|
#include <dahdi/user.h>
|
||||||
#include "tonezone.h"
|
#include "tonezone.h"
|
||||||
@ -137,6 +139,84 @@ static const char *laws[] = {
|
|||||||
"A-law"
|
"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)
|
static const char *sigtype_to_str(const int sig)
|
||||||
{
|
{
|
||||||
switch (sig) {
|
switch (sig) {
|
||||||
@ -1495,6 +1575,21 @@ int main(int argc, char *argv[])
|
|||||||
fprintf(stderr, "%s\n", dahdi_tools_version);
|
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 == -1) fd = open(MASTER_DEVICE, O_RDWR);
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
error("Unable to open master device '%s'\n", MASTER_DEVICE);
|
error("Unable to open master device '%s'\n", MASTER_DEVICE);
|
||||||
|
Loading…
Reference in New Issue
Block a user