Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[dragonfly.git] / usr.sbin / i4b / isdnphone / isdn.c
1 /*
2  * Copyright (c) 1999 Hellmuth Michaelis. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  *
25  *---------------------------------------------------------------------------
26  *
27  *      isdnphone - isdn (i4b) handling
28  *      ===============================
29  *
30  *      $Id: isdn.c,v 1.4 1999/12/13 21:25:26 hm Exp $
31  *
32  * $FreeBSD: src/usr.sbin/i4b/isdnphone/isdn.c,v 1.1.2.1 2001/08/01 17:45:06 obrien Exp $
33  * $DragonFly: src/usr.sbin/i4b/isdnphone/isdn.c,v 1.2 2003/06/17 04:29:55 dillon Exp $
34  *
35  *      last edit-date: [Mon Dec 13 21:53:05 1999]
36  *
37  *---------------------------------------------------------------------------*/
38
39 #include "defs.h"
40
41 /*---------------------------------------------------------------------------*
42  *      dialer init
43  *---------------------------------------------------------------------------*/
44 int
45 init_dial(char *device)
46 {
47         int ret;
48         
49         if((ret = open(device, O_RDWR)) < 0)
50         {
51                 fprintf(stderr, "unable to open %s: %s\n", device, strerror(errno));
52                 return(-1);
53         }
54         return(ret);
55 }
56
57 /*---------------------------------------------------------------------------*
58  *      i4bteld data available handler
59  *---------------------------------------------------------------------------*/
60 void
61 dial_hdlr(void)
62 {
63         char result;
64
65         if((read (dialerfd, &result, 1) < 0))
66         {
67                 fatal("read failed: %s", strerror(errno));
68         }
69
70         switch(result)
71         {
72                 case RSP_CONN:
73                         newstate(ST_ACTIVE);
74                         message("connected to remote!");
75                         break;
76                         
77                 case RSP_BUSY:
78                         message("remote is busy!");
79                         break;
80
81                 case RSP_HUP:
82                         newstate(ST_IDLE);              
83                         message("disconnected from remote!");
84                         break;
85
86                 case RSP_NOA:
87                         message("no answer from remote!");
88                         break;
89
90                 default:
91                         message("unknown response = 0x%2x!", result);
92                         break;
93         }
94 }
95
96 /*---------------------------------------------------------------------------*
97  *      telephone init
98  *---------------------------------------------------------------------------*/
99 int
100 init_tel(char *device)
101 {
102         int ret;
103         int format;
104
105         if(play_fmt == AFMT_MU_LAW)
106                 format = CVT_ALAW2ULAW;
107         else
108                 format = CVT_NONE;              
109         
110         if((ret = open(device, O_RDWR)) < 0)
111                 fatal("unable to open %s: %s\n", device, strerror(errno));
112
113         if((ioctl(ret, I4B_TEL_SETAUDIOFMT, &format)) < 0)
114                 fatal("ioctl I4B_TEL_SETAUDIOFMT failed: %s", strerror(errno));
115
116         return(ret);
117 }
118                 
119 /*---------------------------------------------------------------------------*
120  *      dial number
121  *---------------------------------------------------------------------------*/
122 void
123 do_dial(char *number)
124 {
125         char commandbuffer[80]; 
126         sprintf(commandbuffer, "D%s", number);
127
128         if((write(dialerfd, commandbuffer, strlen(commandbuffer))) < 0)
129         {
130                 fatal("write commandbuffer failed: %s", strerror(errno));
131         }
132 }
133
134 /*---------------------------------------------------------------------------*
135  *      hangup
136  *---------------------------------------------------------------------------*/
137 void
138 do_hangup(void)
139 {
140         char commandbuffer[80]; 
141
142         if(state == ST_IDLE)
143         {
144                 message("tried hangup while ST_IDLE");
145                 return;
146         }
147         
148         sprintf(commandbuffer, "H");
149
150         if((write(dialerfd, commandbuffer, strlen(commandbuffer))) < 0)
151         {
152                 fatal("write commandbuffer failed: %s", strerror(errno));
153         }
154 }
155
156 /*---------------------------------------------------------------------------*
157  *      i4btel speech data available handler
158  *---------------------------------------------------------------------------*/
159 void
160 tel_hdlr(void)
161 {
162         unsigned char buffer[BCH_MAX_DATALEN];
163         int ret;
164
165         ret = read(telfd, buffer, BCH_MAX_DATALEN);
166
167         if(ret < 0)
168         {
169                 fatal("read telfd failed: %s", strerror(errno));
170         }
171
172         debug("tel_hdlr: read %d bytes\n", ret);
173
174         if(ret > 0)
175         {
176                 audiowrite(ret, buffer);
177         }
178 }
179
180 /*---------------------------------------------------------------------------*
181  *      write audio data to ISDN
182  *---------------------------------------------------------------------------*/
183 void
184 telwrite(int len, unsigned char *buf)
185 {
186         if((write(telfd, buf, len)) < 0)
187         {
188                 fatal("write tel failed: %s", strerror(errno));
189         }
190 }
191
192 /* EOF */