-static void gsm_sock_close(void)
-{
- if (gsm->gsm_sock > -1)
- close(gsm->gsm_sock);
- gsm->gsm_sock = -1;
-}
-
-static int gsm_sock_open(char *portname)
-{
- int ret;
- int cnt;
- unsigned long on = 1;
- struct sockaddr_mISDN addr;
- struct mISDN_devinfo devinfo;
- int pri, bri;
-
- /* check port counts */
- ret = ioctl(mISDNsocket, IMGETCOUNT, &cnt);
- if (ret < 0) {
- fprintf(stderr, "Cannot get number of mISDN devices. (ioctl IMGETCOUNT failed ret=%d)\n", ret);
- return(ret);
- }
-
- if (cnt <= 0) {
- PERROR_RUNTIME("Found no card. Please be sure to load card drivers.\n");
- return -EIO;
- }
- gsm->gsm_port = mISDN_getportbyname(mISDNsocket, cnt, portname);
- if (gsm->gsm_port < 0) {
- PERROR_RUNTIME("Port name '%s' not found, did you load loopback interface for GSM?.\n", portname);
- return gsm->gsm_port;
- }
- /* get protocol */
- bri = pri = 0;
- devinfo.id = gsm->gsm_port;
- ret = ioctl(mISDNsocket, IMGETDEVINFO, &devinfo);
- if (ret < 0) {
- PERROR_RUNTIME("Cannot get device information for port %d. (ioctl IMGETDEVINFO failed ret=%d)\n", gsm->gsm_port, ret);
- return ret;
- }
- if (devinfo.Dprotocols & (1 << ISDN_P_TE_S0)) {
- bri = 1;
- }
- if (devinfo.Dprotocols & (1 << ISDN_P_TE_E1)) {
- pri = 1;
- }
- if (!pri && !pri) {
- PERROR_RUNTIME("GSM port %d does not support TE PRI or TE BRI.\n", gsm->gsm_port);
- }
- /* open socket */
- if ((gsm->gsm_sock = socket(PF_ISDN, SOCK_DGRAM, (pri)?ISDN_P_TE_E1:ISDN_P_TE_S0)) < 0) {
- PERROR_RUNTIME("GSM port %d failed to open socket.\n", gsm->gsm_port);
- gsm_sock_close();
- return gsm->gsm_sock;
- }
- /* set nonblocking io */
- if ((ret = ioctl(gsm->gsm_sock, FIONBIO, &on)) < 0) {
- PERROR_RUNTIME("GSM port %d failed to set socket into nonblocking io.\n", gsm->gsm_port);
- gsm_sock_close();
- return ret;
- }
- /* bind socket to dchannel */
- memset(&addr, 0, sizeof(addr));
- addr.family = AF_ISDN;
- addr.dev = gsm->gsm_port;
- addr.channel = 0;
- if ((ret = bind(gsm->gsm_sock, (struct sockaddr *)&addr, sizeof(addr))) < 0) {
- PERROR_RUNTIME("GSM port %d failed to bind socket. (name = %s errno=%d)\n", gsm->gsm_port, portname, errno);
- gsm_sock_close();
- return (ret);
- }
-
- return 0;
-}
-