00001
00002
00003
00004
00005
00006
00007
00008 #include <sys/types.h>
00009 #include <sys/socket.h>
00010 #include <netinet/in.h>
00011 #include <arpa/inet.h>
00012 #include <time.h>
00013 #include <ctype.h>
00014 #include <string.h>
00015 #include <stdio.h>
00016 #include <sys/timeb.h>
00017 #include <sys/types.h>
00018 #include <sys/stat.h>
00019 #include <fcntl.h>
00020 #include <unistd.h>
00021 #include <stdlib.h>
00022 #include <getopt.h>
00023 #include <termios.h>
00024
00025 typedef struct
00026 {
00027 char ring_line[5];
00028 char date[5];
00029 char time[5];
00030 char number[20];
00031 char name[20];
00032 } CID_Info;
00033
00034 int checkfor_cid_info(char *buffer, int len, CID_Info *cid_info);
00035 int checkfor_two_rings(char *buffer, int len);
00036
00037 typedef struct
00038 {
00039 char *name;
00040 char *number;
00041 } phonebook_entry;
00042
00043 phonebook_entry *phonebook = NULL;
00044 int phonebook_size = 0;
00045
00046 void read_phonebook(const char *filename)
00047 {
00048 FILE *pb = fopen(filename, "r");
00049 if (pb == NULL)
00050 {
00051 fprintf(stderr, "Unable to open phonebook file %s\n", filename);
00052 exit(1);
00053 }
00054 fseek(pb, 0L, SEEK_END);
00055 int pbsize = ftell(pb);
00056 fseek(pb, 0L, SEEK_SET);
00057 char *pbtext = (char *) malloc(pbsize+1);
00058 fread(pbtext, 1, pbsize, pb);
00059 fclose(pb);
00060
00061 int num_entries = 0;
00062 char *cp;
00063 for (cp = pbtext; *cp != '\0'; cp++)
00064 if (*cp == '\n') num_entries++;
00065 if (num_entries == 0) return;
00066
00067 phonebook = (phonebook_entry *) malloc(num_entries * sizeof(phonebook_entry));
00068 int i;
00069 for (i = 0; i < num_entries; i++)
00070 {
00071 if ((phonebook[i].number = strtok(pbtext, ":")) == NULL) return;
00072 pbtext = NULL;
00073 if ((phonebook[i].name = strtok(pbtext, "\n")) == NULL) return;
00074 phonebook_size++;
00075 }
00076 }
00077
00078 void match_in_phonebook(CID_Info *cid_info)
00079 {
00080 if (phonebook == NULL) return;
00081 int i;
00082 for (i = 0; i < phonebook_size; i++)
00083 {
00084 if (strcmp(cid_info->number, phonebook[i].number) == 0)
00085 {
00086 strcpy(cid_info->name, phonebook[i].name);
00087 return;
00088 }
00089 }
00090 }
00091
00092 int verbose = 0;
00093 char xml_filename[255];
00094 char bcast_addr[16];
00095 int bcast_addr_hex=-1;
00096 char serial_port[16];
00097 int udp_port;
00098 char modem_init_string[255];
00099
00100 int ipaddr_to_int(const char *stringIP, unsigned int *ip)
00101 {
00102 int a,b,c,d;
00103
00104 if (4 != sscanf(stringIP, "%d.%d.%d.%d", &a, &b, &c, &d))
00105 {
00106 return -1;
00107 }
00108
00109 *ip = ((a&0xFF) << 24) +
00110 ((b&0xFF) << 16) +
00111 ((c&0xFF) << 8) +
00112 (d&0xFF);
00113
00114 return 0;
00115 }
00116
00117 char *get_tail(char *string)
00118 {
00119 char *c;
00120 c = string+strlen(string);
00121 int found = 0;
00122 while(c!=string)
00123 {
00124 if (*c=='/')
00125 {
00126 found = 1;
00127 c++;
00128 break;
00129 }
00130 c--;
00131 }
00132
00133 return c;
00134 }
00135
00136 char *replace(char *in_string, char *out_string, char* key_string, char *replace_string)
00137 {
00138 int str_index, outstring_idx, key_idx, end, replace_len, key_len, cpy_len;
00139 char *c;
00140
00141 if ((c = (char *) strstr(in_string, key_string)) == NULL)
00142 {
00143 strcpy(out_string, in_string);
00144 return out_string;
00145 }
00146
00147 replace_len = strlen(replace_string);
00148 key_len = strlen(key_string);
00149 end = strlen(in_string) - key_len;
00150 key_idx = c - in_string;
00151
00152 outstring_idx = 0;
00153 str_index = 0;
00154 while(str_index <= end && c != NULL)
00155 {
00156
00157 cpy_len = key_idx-str_index;
00158 strncpy(out_string+outstring_idx, in_string+str_index, cpy_len);
00159 outstring_idx += cpy_len;
00160 str_index += cpy_len;
00161
00162
00163 strcpy(out_string+outstring_idx, replace_string);
00164 outstring_idx += replace_len;
00165 str_index += key_len;
00166
00167
00168 if ((c = (char *) strstr(in_string+str_index, key_string)) != NULL)
00169 {
00170 key_idx = c - in_string;
00171 }
00172 }
00173
00174
00175 strcpy(out_string+outstring_idx, in_string+str_index);
00176
00177 return out_string;
00178 }
00179
00180 int open_modem()
00181 {
00182 int fd;
00183 struct termios options;
00184
00185
00186 fd = open(serial_port, O_RDWR | O_NOCTTY | O_NDELAY);
00187 fcntl(fd, F_SETFL, 0);
00188
00189
00190 tcgetattr(fd, &options);
00191
00192
00193 cfsetospeed(&options, B38400);
00194 cfsetispeed(&options, B38400);
00195 options.c_cflag |= (CLOCAL | CREAD);
00196 options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
00197 options.c_oflag &= ~OPOST;
00198 options.c_cc[VMIN] = 0;
00199 options.c_cc[VTIME] = 10;
00200
00201
00202 tcsetattr(fd, TCSANOW, &options);
00203
00204 return fd;
00205 }
00206
00207 int issue_modem_cmd(int fd, char *cmd_string)
00208 {
00209 char buffer[255];
00210 char *bufptr;
00211 int nbytes;
00212 int tries;
00213
00214 memset(buffer, 0, 255);
00215
00216 for (tries = 0; tries < 3; tries ++)
00217 {
00218
00219 if (verbose)
00220 {
00221 printf("Send %s\n", cmd_string);
00222 }
00223
00224 if (write(fd, cmd_string, strlen(cmd_string)) < strlen(cmd_string))
00225 {
00226 printf("AT send failed on try %d\n", tries);
00227 continue;
00228 }
00229
00230
00231 bufptr = buffer;
00232 while ((nbytes = read(fd, bufptr, buffer + sizeof(buffer) - bufptr - 1)) > 0)
00233 {
00234 bufptr += nbytes;
00235 if (bufptr[-1] == '\n' || bufptr[-1] == '\r')
00236 break;
00237 }
00238
00239
00240 *bufptr = '\0';
00241
00242 if (strstr(buffer, "OK") != 0)
00243 return (0);
00244
00245 sleep(1);
00246 }
00247
00248 return (-1);
00249 }
00250
00251 int waitfor_ring(int fd, char *wait_string, CID_Info *cid_info)
00252 {
00253 char buffer[255];
00254 char *bufptr;
00255 int nbytes;
00256 fd_set mrd_set;
00257 int rv;
00258 struct timeval tv;
00259 struct timeval *tv_p;
00260 memset(buffer, 0, 255);
00261 int first = 0;
00262
00263 FD_ZERO(&mrd_set);
00264 FD_SET (fd, &mrd_set);
00265
00266
00267 bufptr = buffer;
00268
00269 while (1)
00270 {
00271
00272 if (first == 0)
00273 {
00274 tv_p = NULL;
00275 first = 1;
00276 }
00277 else
00278 {
00279 tv.tv_sec = 10;
00280 tv.tv_usec = 0;
00281 tv_p = &tv;
00282 }
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292 rv = select(fd+1, &mrd_set, NULL, NULL, tv_p);
00293 if (rv < 0)
00294 {
00295 printf("Select failed\n");
00296 return -1;
00297 }
00298 else if (rv == 0)
00299 {
00300 if (verbose)
00301 {
00302 printf("Timed out\n");
00303 }
00304 return -1;
00305 }
00306
00307 if (FD_ISSET(fd, &mrd_set))
00308 {
00309 while ((nbytes = read(fd, bufptr, buffer + sizeof(buffer) - bufptr - 1)) > 0)
00310 {
00311 bufptr += nbytes;
00312 }
00313
00314
00315 *bufptr = '\0';
00316
00317 if (checkfor_cid_info(buffer, 255,
00318 cid_info))
00319 {
00320 return 0;
00321 }
00322
00323
00324 if (checkfor_two_rings(buffer, 255))
00325 {
00326 return -1;
00327 }
00328 }
00329 }
00330
00331 return (-1);
00332 }
00333
00334 int checkfor_two_rings(char *buffer, int len)
00335 {
00336 char *bptr;
00337 char *c;
00338 char key[6] = "\nRING";
00339
00340 if ((c = (char *) strstr(buffer, key)) == NULL)
00341 {
00342 if (verbose)
00343 {
00344 printf("Found ZERO RINGS\n");
00345 }
00346 return 0;
00347 }
00348
00349 bptr = c+strlen(key);
00350 if ((c = (char *) strstr(bptr, key)) == NULL)
00351 {
00352 if (verbose)
00353 {
00354 printf("Found ONE RINGS\n");
00355 }
00356 return 0;
00357 }
00358 else
00359 {
00360 if (verbose)
00361 {
00362 printf("Found TWO RINGS\n");
00363 }
00364 return 1;
00365 }
00366
00367 }
00368
00369 char *extract_cid_field(char *buffer, int len, char *field_name, int *field_len)
00370 {
00371 char *bptr, *eptr;
00372 char *c;
00373 int complete;
00374
00375 if ((c = (char *) strstr(buffer, field_name)) == NULL)
00376 {
00377 if (verbose)
00378 {
00379 printf("%s not Found\n", field_name);
00380 }
00381 return 0;
00382 }
00383
00384 bptr = c+strlen(field_name);
00385 eptr = bptr;
00386 complete = 0;
00387 while (eptr != 0)
00388 {
00389 if ((*eptr == '\r' || *eptr == '\n'))
00390 {
00391 complete = 1;
00392 break;
00393 }
00394 eptr++;
00395 }
00396
00397 if (complete)
00398 {
00399 *field_len = eptr - bptr;
00400 return bptr;
00401 }
00402 else
00403 {
00404 *field_len = 0;
00405 return NULL;
00406 }
00407 }
00408
00409 int getNum(char *dest, int dsize, const char *src, int ssize)
00410 {
00411 int ret = 0;
00412
00413 if ( dest && src )
00414 {
00415 int i, j;
00416 memset(dest, 0, dsize);
00417 for(i=0,j=0; i<ssize && i<dsize; i++)
00418 {
00419 if ( isspace(src[i]) )
00420 {
00421 break;
00422 }
00423 else if ( isdigit(src[i]) )
00424 {
00425 dest[j++] = src[i];
00426 }
00427 }
00428 ret = j;
00429 }
00430
00431 return ret;
00432 }
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449 int checkfor_cid_info(char *buffer, int len, CID_Info *cid_info)
00450 {
00451 char *field_ptr, date[8], time[8];
00452 int field_len, time_len = 0;
00453
00454 if ( (field_ptr = extract_cid_field(buffer, len, "NAME = ", &field_len))
00455 || (field_ptr = extract_cid_field(buffer, len, "CALLER NAME: ", &field_len)) )
00456 {
00457 memset(cid_info->name, 0, sizeof(cid_info->name));
00458 memcpy(cid_info->name, field_ptr, field_len);
00459 if (verbose)
00460 {
00461 printf("name %s\n",cid_info->name);
00462 }
00463 }
00464 else
00465 {
00466 if (verbose)
00467 {
00468 printf("NAME not found\n");
00469 }
00470 return 0;
00471 }
00472
00473 if ( (field_ptr = extract_cid_field(buffer, len, "NMBR = ", &field_len))
00474 || (field_ptr = extract_cid_field(buffer, len, "CALLER NUMBER: ", &field_len)) )
00475 {
00476 memset(cid_info->number, 0, sizeof(cid_info->number));
00477 memcpy(cid_info->number, field_ptr, field_len);
00478 if (verbose)
00479 {
00480 printf("number %s\n",cid_info->number);
00481 }
00482 }
00483 else
00484 {
00485 if (verbose)
00486 {
00487 printf("NMBR not found\n");
00488 }
00489 return 0;
00490 }
00491
00492 if ( (field_ptr = extract_cid_field(buffer, len, "TIME: ", &field_len)) )
00493 {
00494 int date_len;
00495 date_len = getNum(date, sizeof(date), field_ptr, field_len);
00496 time_len = getNum(time, sizeof(time), &field_ptr[date_len+2], field_len-date_len-2);
00497 field_ptr = &date[0];
00498 field_len = date_len;
00499 if ( verbose )
00500 {
00501 printf( "Date(%d): %s\nTime(%d): %s\nField_ptr: %s\n",
00502 field_len, date, time_len, time, field_ptr );
00503 }
00504 }
00505 else
00506 {
00507 field_ptr = extract_cid_field(buffer, len, "DATE = ", &field_len);
00508 }
00509 if (field_ptr)
00510 {
00511 memset(cid_info->date, 0, sizeof(cid_info->date));
00512 memcpy(cid_info->date, field_ptr, field_len);
00513 if (verbose)
00514 {
00515 printf("date %s\n",cid_info->date);
00516 }
00517 }
00518 else
00519 {
00520 if (verbose)
00521 {
00522 printf("DATE not found\n");
00523 }
00524 return 0;
00525 }
00526
00527 if (time_len)
00528 {
00529 field_ptr = &time[0];
00530 field_len = time_len;
00531 }
00532 else
00533 {
00534 field_ptr = extract_cid_field(buffer, len, "TIME = ", &field_len);
00535 }
00536 if (field_ptr)
00537 {
00538 memset(cid_info->time, 0, sizeof(cid_info->time));
00539 memcpy(cid_info->time, field_ptr, field_len);
00540 if (verbose)
00541 {
00542 printf("time %s\n",cid_info->time);
00543 }
00544 }
00545 else
00546 {
00547 if (verbose)
00548 {
00549 printf("TIME not found\n");
00550 }
00551 return 0;
00552 }
00553
00554 field_ptr = extract_cid_field(buffer, len, "RING", &field_len);
00555 if (field_ptr)
00556 {
00557 memset(cid_info->ring_line, 0, sizeof(cid_info->ring_line));
00558 memcpy(cid_info->ring_line, field_ptr, field_len);
00559 if (strcmp(cid_info->ring_line, " A") == 0)
00560 {
00561 strcpy(cid_info->ring_line, "1");
00562 }
00563 else if (strcmp(cid_info->ring_line, " B") == 0)
00564 {
00565 strcpy(cid_info->ring_line, "2");
00566 }
00567 else if (strcmp(cid_info->ring_line, " C") == 0)
00568 {
00569 strcpy(cid_info->ring_line, "3");
00570 }
00571 else if (strcmp(cid_info->ring_line, " D") == 0)
00572 {
00573 strcpy(cid_info->ring_line, "4");
00574 }
00575 else
00576 {
00577 strcpy(cid_info->ring_line, "1");
00578 }
00579
00580 if (verbose)
00581 {
00582 printf("ring_line %s\n",cid_info->ring_line);
00583 }
00584 }
00585 else
00586 {
00587 if (verbose)
00588 {
00589 printf("RING not found\n");
00590 }
00591 return 0;
00592 }
00593
00594 return 1;
00595 }
00596
00597 int close_modem(int fd)
00598 {
00599 close(fd);
00600
00601 return 0;
00602
00603 }
00604
00605 int init_modem(int *fd)
00606 {
00607
00608 *fd = open_modem();
00609
00610 if (*fd <= 0)
00611 {
00612 printf("error open modem\n");
00613 return -1;
00614 }
00615
00616 if (write(*fd, "+++", 3) != 3)
00617 {
00618 printf("error init modem\n");
00619 return -1;
00620 }
00621
00622 sleep(2);
00623
00624 if (issue_modem_cmd(*fd, "AT\r") < 0)
00625 {
00626 printf("error init modem\n");
00627 return -1;
00628 }
00629
00630 if (issue_modem_cmd(*fd, modem_init_string) < 0)
00631 {
00632 printf("error init modem\n");
00633 return -1;
00634 }
00635
00636 return 0;
00637 }
00638
00639 void print_help(char *progname)
00640 {
00641 printf("\nUsage: %s [--once] --file=xyz.xml [OPTIONS]\n", progname);
00642 printf("A caller id UDP broadcast utility.\n\n");
00643 printf(" -d, --device : serial device (--device=/dev/ttyS0)\n");
00644 printf(" -u, --udpport : UDP port to broadcase (--udpport=6947)\n");
00645 printf(" -b, --bcast : UDP broadcast address (--bcast=255.255.255.255)\n");
00646 printf(" -f, --file : (REQUIRED)XML file to use as a template (--file=cidbcast.xml)\n");
00647 printf(" -i, --init : Modem init string (--init=\"AT S7=45 S0=0 L0 V1 X4 &c1 E0 Q0 #CID=1 S41=1\")\n");
00648 printf(" -l, --logfile : Append stdout and stderr (--logfile=/var/log/cibcast.log)\n");
00649 printf(" -p, --phonebook : File of NUMBER:NAME lines used to supply/override caller names\n");
00650 printf(" -v, --verbose : some debug stuff\n");
00651
00652 printf("\n -o, --once : runs program in 'single shot' mode (see README)\n");
00653 printf(" (if --once): --file=cidbcast.xml [port] [number] [name] [line]\n");
00654
00655 }
00656
00657 int main(int argc, char *argv[])
00658 {
00659 struct sockaddr_in addr;
00660 int fd;
00661 int yes = 1;
00662 char* raw_message;
00663 char* message;
00664 char* tmp1_message;
00665 char* tmp2_message;
00666 struct timeb time;
00667 struct tm* timeValues;
00668 FILE *fptr;
00669 long fsize;
00670 CID_Info cid_info;
00671 int modem_fd;
00672 int done = 0;
00673 int rv;
00674 int option_index = 0, c;
00675 int file_arg_found = 0;
00676 int single_shot = 0;
00677 char string[255];
00678
00679 static struct option long_options[] =
00680 {
00681 {"device", required_argument, 0, 'd'},
00682 {"udpport", required_argument, 0, 'u'},
00683 {"bcast", required_argument, 0, 'b'},
00684 {"file", required_argument, 0, 'f'},
00685 {"logfile", required_argument, 0, 'l'},
00686 {"phonebook", required_argument, 0, 'p'},
00687 {"init", required_argument, 0, 'i'},
00688 {"help", no_argument, 0, 'h'},
00689 {"verbose", no_argument, 0, 'v'},
00690 {"once", no_argument, 0, 'o'},
00691 {0, 0, 0, 0}
00692 };
00693
00694 memset(&cid_info, 0, sizeof(cid_info));
00695
00696
00697 strcpy(xml_filename, "");
00698 strcpy(bcast_addr, "255.255.255.255");
00699 ipaddr_to_int(bcast_addr, &bcast_addr_hex);
00700 strcpy(serial_port, "/dev/ttyS0");
00701 strcpy(modem_init_string, "AT S7=45 S0=0 L0 V1 X4 &c1 E0 Q0 #CID=1 S41=1\r");
00702 udp_port = 6947;
00703
00704 while (1)
00705 {
00706 c = getopt_long (argc, argv, "t:p:b:f:si:hvo",
00707 long_options, &option_index);
00708 if (c == -1)
00709 break;
00710
00711 switch (c)
00712 {
00713
00714 case 'd':
00715 strncpy(serial_port, optarg, sizeof(serial_port)-1);
00716 break;
00717
00718 case 'i':
00719 strncpy(modem_init_string, optarg, sizeof(modem_init_string)-2);
00720 modem_init_string[strlen(modem_init_string)] = '\r';
00721 break;
00722
00723 case 'u':
00724 udp_port = atoi(optarg);
00725 break;
00726
00727 case 'b':
00728 strncpy(bcast_addr, optarg, sizeof(bcast_addr));
00729 if (ipaddr_to_int(bcast_addr, &bcast_addr_hex) < 0)
00730 {
00731 printf("Error in Broadcast address %s\n",
00732 bcast_addr);
00733 exit(1);
00734 }
00735 break;
00736
00737 case 'f':
00738 strncpy(xml_filename, optarg, sizeof(xml_filename)-1);
00739 file_arg_found = 1;
00740 break;
00741
00742 case 'l':
00743
00744 if (freopen(optarg, "a", stdout) == (FILE *) NULL ||
00745 dup2(STDOUT_FILENO, STDERR_FILENO) < 0)
00746 {
00747 fprintf(stderr, "Unable to open logfile %s\n", optarg);
00748 exit(1);
00749 }
00750 setbuf(stdout, NULL);
00751 break;
00752
00753 case 'p':
00754 read_phonebook(optarg);
00755 break;
00756
00757 case 'h':
00758 print_help(argv[0]);
00759 exit(0);
00760 break;
00761
00762 case 'v':
00763 verbose = 1;
00764 printf("Verbose mode enabled\n");
00765 break;
00766
00767 case 'o':
00768 printf("Single shot mode enabled - sending UDP and exiting\n");
00769 single_shot = 1;
00770 break;
00771
00772 default:
00773 print_help(argv[0]);
00774 exit(0);
00775 }
00776 }
00777
00778 if (optind < argc) {
00779 if (single_shot)
00780 {
00781 strcpy(serial_port, argv[optind++]);
00782 strcpy(cid_info.number, argv[optind++]);
00783 strcpy(cid_info.name, argv[optind++]);
00784 strcpy(cid_info.ring_line, argv[optind++]);
00785 strcpy(cid_info.date, "");
00786 strcpy(cid_info.time, "");
00787 }
00788 }
00789
00790 if (!file_arg_found)
00791 {
00792 print_help(argv[0]);
00793 return -1;
00794 }
00795
00796 fptr=fopen(xml_filename, "r");
00797 if (fptr == NULL)
00798 {
00799 printf("Could not open xml file %s - exiting\n", xml_filename);
00800 exit(1);
00801 }
00802
00803
00804 (void)fseek(fptr, 0L, SEEK_END);
00805 fsize = ftell(fptr);
00806 (void)fseek(fptr, 0L, SEEK_SET);
00807
00808
00809 raw_message = (char *)malloc(fsize+1);
00810 tmp1_message = (char *)malloc(fsize+1024);
00811 tmp2_message = (char *)malloc(fsize+1024);
00812 message = (char *)malloc(fsize+1024);
00813
00814 fread(raw_message, 1, fsize, fptr);
00815 if (verbose)
00816 {
00817 printf("raw_message (%lu):\n%s", fsize, raw_message);
00818 }
00819 fclose(fptr);
00820
00821 if (!single_shot)
00822 {
00823 if (init_modem(&modem_fd) < 0)
00824 {
00825 printf("Error initializing modem %s - exiting\n", serial_port);
00826 exit(1);
00827 }
00828 else
00829 {
00830 printf("Modem %s initialized OK - waiting for RING\n", serial_port);
00831 }
00832 }
00833
00834 while (!done)
00835 {
00836 if (!single_shot)
00837 {
00838 rv = waitfor_ring(modem_fd, "RING", &cid_info);
00839 }
00840 else
00841 {
00842 rv = 0;
00843 }
00844
00845 if (rv == 0)
00846 {
00847
00848 if (single_shot)
00849 {
00850 done = 1;
00851 }
00852
00853 ftime(&time);
00854 timeValues = localtime(&(time.time));
00855
00856 match_in_phonebook(&cid_info);
00857
00858
00859 if (strcmp(cid_info.name, "0") == 0)
00860 {
00861 strcpy(cid_info.name, "Unknown");
00862 }
00863
00864 replace(raw_message, tmp2_message, "%cid_number%", cid_info.number);
00865 replace(tmp2_message, tmp1_message, "%cid_name%", cid_info.name);
00866 replace(tmp1_message, tmp2_message, "%cid_date%", cid_info.date);
00867 replace(tmp2_message, tmp1_message, "%cid_time%", cid_info.time);
00868 replace(tmp1_message, tmp2_message, "%cid_ring_type%", cid_info.ring_line);
00869 replace(tmp2_message, tmp1_message, "%cid_port%",
00870 get_tail(serial_port));
00871 sprintf(string, "%d", (int)time.time);
00872 replace(tmp1_message, tmp2_message, "%cid_time_stamp%", string);
00873 sprintf(string, "%s", tzname[1]);
00874 replace(tmp2_message, tmp1_message, "%cid_time_zone%", string);
00875 sprintf(string, "%d", timeValues->tm_isdst);
00876 replace(tmp1_message, tmp2_message, "%cid_daylight_saving%", string);
00877 sprintf(string, "%d", timeValues->tm_hour);
00878 replace(tmp2_message, tmp1_message, "%cid_time_hour%", string);
00879 sprintf(string, "%d", timeValues->tm_min);
00880 replace(tmp1_message, tmp2_message, "%cid_time_minute%", string);
00881 sprintf(string, "%d", timeValues->tm_sec);
00882 replace(tmp2_message, tmp1_message, "%cid_time_second%", string);
00883 sprintf(string, "%d", timeValues->tm_mday);
00884 replace(tmp1_message, tmp2_message, "%cid_time_day%", string);
00885 sprintf(string, "%d", timeValues->tm_mon + 1);
00886 replace(tmp2_message, tmp1_message, "%cid_time_month%", string);
00887 sprintf(string, "%d", timeValues->tm_year + 1900);
00888 replace(tmp1_message, tmp2_message, "%cid_time_year%", string);
00889 replace(tmp2_message, tmp1_message, "%cid_time_string%", ctime(&(time.time)));
00890 strcpy(message, tmp1_message);
00891
00892 if (verbose)
00893 {
00894 printf("\nmessage (%u):\n%s", strlen(message), message);
00895 }
00896
00897
00898 if ((fd=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) < 0)
00899 {
00900 perror("socket");
00901 exit(1);
00902 }
00903
00904
00905 if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(int) ) < 0)
00906 {
00907 perror("bind");
00908 exit(1);
00909 }
00910
00911
00912 memset(&addr,0,sizeof(addr));
00913 addr.sin_family = AF_INET;
00914 addr.sin_addr.s_addr=htonl(bcast_addr_hex);
00915 addr.sin_port=htons(udp_port);
00916
00917
00918 if (sendto(fd,message,strlen(message),0,(struct sockaddr *) &addr,
00919 sizeof(addr)) < 0)
00920 {
00921 perror("sendto");
00922 }
00923 else
00924 {
00925 printf("Sent UDP/XML packet to IP %s port %d\n", bcast_addr, udp_port);
00926 }
00927 close (fd);
00928 }
00929 else
00930 {
00931 if (verbose)
00932 {
00933 printf("Error getting CID_info, dont send anything\n");
00934 }
00935 }
00936 }
00937
00938 if (!single_shot)
00939 {
00940 close_modem(modem_fd);
00941 }
00942
00943 return 0;
00944 }
00945
00946