+
+#define RING "RING\r\n"
+
+int ring_waiter(int fh, int ring_numb, int ring_inter)
+{
+ char bf[512];
+ int ret, ct_cur = 0;
+ struct timespec ts;
+ time_t tout = 0;
+
+ if (verbose >= 3) fprintf(stderr, "%s:: BEGIN\n", __FUNCTION__);
+
+ while ((ret = read(fh, bf, 511)) > 0) {
+ bf[ret] = '\0';
+ if (strstr(bf, RING)) {
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+
+ if (ct_cur > 0) {
+ if (ts.tv_sec < tout) {
+ if ((ct_cur + 1) == ring_numb) {
+ return (1);
+ }
+ }
+ else {
+ ct_cur = 0;
+ }
+ }
+ tout = ts.tv_sec + ring_inter;
+ ct_cur++;
+ }
+ if (verbose >= 3) fprintf(stderr, "%s:: ct_cur: %d\n", __FUNCTION__, ct_cur);
+ }
+ return 0;
+}
+
+int greetings_send(int fh, char *gree)
+{
+ FILE *fp;
+ int ret, i, e;
+ unsigned char bf[10240], bf2[10240];
+
+ /* sox greetings.wav -e unsigned-integer -b 8 -r 8000 -c 1 greetings.raw */
+ if ((fp = fopen(gree, "r")) == NULL) {
+ if (verbose >= 1) fprintf(stderr, "open greetings [%s] failed\n", gree);
+ return 0;
+ }
+ while ((ret = fread(bf, 1, 512, fp)) > 0) {
+ for (i = 0, e = 0 ; i < ret ; i++, e++) {
+ if (bf[i] == '\x10') {
+ bf2[e++] = '\x10';
+ bf2[e] = '\x10';
+ if (verbose >= 5) fprintf(stderr, "bf[%u] bf[%u]\n", bf[i], bf[i+1]);
+ }
+ else {
+ bf2[e] = bf[i];
+ }
+ }
+ write(fh, bf2, e);
+ }
+ fclose(fp);
+
+ return 1;
+}
+