mISDNuser/tools/info.c

198 lines
5.4 KiB
C

/*****************************************************************************\
** **
** isdninfo **
** **
**---------------------------------------------------------------------------**
** Copyright: Andreas Eversberg (GPL) **
** **
** user space utility to list mISDN devices **
** **
\*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <mISDN/mISDNif.h>
#include <mISDN/af_isdn.h>
#include <errno.h>
char *spaces = " ";
int main(int argc, char *argv[])
{
int ret;
int i, ii, c, start_c;
int useable, nt, te, pri, bri, pots, s0;
struct mISDN_devinfo devinfo;
int sock;
/* open mISDN */
sock = socket(PF_ISDN, SOCK_RAW, ISDN_P_BASE);
if (sock < 0) {
fprintf(stderr, "Cannot open mISDN due to %s. (Does your Kernel support socket based mISDN?)\n", strerror(errno));
exit(EXIT_FAILURE);
}
/* get number of stacks */
i = 0;
ret = ioctl(sock, IMGETCOUNT, &ii);
if (ret < 0) {
fprintf(stderr, "Cannot get number of mISDN devices. (ioctl IMGETCOUNT failed ret=%d)\n", ret);
goto done;
}
printf("\n");
if (ii <= 0) {
printf("Found no card. Please be sure to load card drivers.\n");
goto done;
} else
printf("Found %i port%s\n", ii, (ii > 1) ? "s" : "");
/* loop the number of cards and get their info */
while (ii && i <= MAX_DEVICE_ID) {
nt = te = bri = pri = pots = s0 = 0;
useable = 0;
devinfo.id = i;
ret = ioctl(sock, IMGETDEVINFO, &devinfo);
if (ret < 0) {
fprintf(stderr, "error getting info for device %d: %s\n", i, strerror(errno));
goto next_dev;
}
/* output the port info */
printf(" Port %2d '%s':", i, devinfo.name);
if (strlen(devinfo.name) <= strlen(spaces))
printf("%s", spaces + strlen(devinfo.name));
else
printf("\n ");
if (devinfo.Dprotocols & (1 << ISDN_P_TE_S0)) {
bri = 1;
te = 1;
s0 = 1;
}
if (devinfo.Dprotocols & (1 << ISDN_P_NT_S0)) {
bri = 1;
nt = 1;
s0 = 1;
}
if (devinfo.Dprotocols & (1 << ISDN_P_TE_E1)) {
pri = 1;
te = 1;
}
if (devinfo.Dprotocols & (1 << ISDN_P_NT_E1)) {
pri = 1;
nt = 1;
}
if (devinfo.Dprotocols & (1 << ISDN_P_TE_UP0)) {
bri = 1;
te = 1;
}
if (devinfo.Dprotocols & (1 << ISDN_P_NT_UP0)) {
bri = 1;
nt = 1;
}
#ifdef ISDN_P_FXS
if (devinfo.Dprotocols & (1 << ISDN_P_FXS)) {
pots = 1;
te = 1;
}
#endif
#ifdef ISDN_P_FXO
if (devinfo.Dprotocols & (1 << ISDN_P_FXO)) {
pots = 1;
nt = 1;
}
#endif
if ((te || nt) && (bri || pri || pots))
useable = 1;
if (te && nt && bri)
printf("TE/NT-mode BRI %s (for phone lines & phones)", (s0) ? "S/T" : "UP0");
if (te && !nt && bri)
printf("TE-mode BRI %s (for phone lines)", (s0) ? "S/T" : "UP0");
if (nt && !te && bri)
printf("NT-mode BRI %s (for phones)", (s0) ? "S/T" : "UP0");
if (te && nt && pri)
printf("TE/NT-mode PRI E1 (for phone lines & E1 devices)");
if (te && !nt && pri)
printf("TE-mode PRI E1 (for phone lines)");
if (nt && !te && pri)
printf("NT-mode PRI E1 (for E1 devices)");
if (te && nt && pots)
printf("FXS/FXO POTS (for analog lines & phones)");
if (te && !nt && pots)
printf("FXS POTS (for analog lines)");
if (nt && !te && pots)
printf("FXO POTS (for analog phones)");
if (pots) {
useable = 0;
printf("\n -> Analog interfaces are not supported.");
} else if (!useable) {
printf("unsupported interface protocol bits 0x%016x", devinfo.Dprotocols);
}
printf("\n %2d B-channels:", devinfo.nrbchan);
c = 0;
start_c = -1;
while (c <= MISDN_MAX_CHANNEL + 1) {
if (c <= MISDN_MAX_CHANNEL && test_channelmap(c, devinfo.channelmap)) {
if (start_c < 0)
start_c = c;
} else {
if (start_c >= 0) {
if (c - 1 == start_c)
printf(" %d", start_c);
else
printf(" %d-%d", start_c, c - 1);
start_c = -1;
}
}
c++;
}
printf("\n");
printf(" B-protocols:");
if (devinfo.Bprotocols & (1 << (ISDN_P_B_RAW & ISDN_P_B_MASK))) {
printf(" RAW");
}
if (devinfo.Bprotocols & (1 << (ISDN_P_B_HDLC & ISDN_P_B_MASK))) {
printf(" HDLC");
}
if (devinfo.Bprotocols & (1 << (ISDN_P_B_X75SLP & ISDN_P_B_MASK))) {
printf(" X75slp");
}
if (devinfo.Bprotocols & (1 << (ISDN_P_B_L2DTMF & ISDN_P_B_MASK))) {
printf(" L2:DTMF");
}
if (devinfo.Bprotocols & (1 << (ISDN_P_B_L2DSP & ISDN_P_B_MASK))) {
printf(" L2:DSP");
}
if (devinfo.Bprotocols & (1 << (ISDN_P_B_L2DSPHDLC & ISDN_P_B_MASK))) {
printf(" L2:DSPHDLC");
}
if (devinfo.Bprotocols & (1 << (ISDN_P_B_T30_FAX & ISDN_P_B_MASK))) {
printf(" T30-Fax");
}
if (devinfo.Bprotocols & (1 << (ISDN_P_B_MODEM_ASYNC & ISDN_P_B_MASK))) {
printf(" asnc.Modem");
}
printf("\n");
if (!useable)
printf(" * Port NOT useable for LCR\n");
if (ii > 1)
printf(" --------\n");
ii--;
next_dev:
i++;
}
printf("\n");
done:
close(sock);
return (0);
}