Changeset 11473 for trunk/module-gbox-sms.c
- Timestamp:
- 01/18/19 20:17:57 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-gbox-sms.c
r11441 r11473 15 15 static int32_t poll_gsms_data (uint16_t *boxid, uint8_t *num, char *text) 16 16 { 17 char *fext= FILE_GSMS_TXT; 18 char *fname = get_gbox_tmp_fname(fext); 17 char *fext= FILE_GSMS_TXT; 18 char *fname = get_gbox_tmp_fname(fext); 19 19 FILE *fhandle = fopen(fname, "r"); 20 20 if(!fhandle) 21 21 { 22 22 //cs_log("Couldn't open %s: %s", fname, strerror(errno)); 23 23 return -2; 24 } 24 } 25 25 26 uint32_t length1; 26 27 uint8_t length; 27 28 char buffer[140]; 28 29 char *tail; 30 29 31 memset(buffer, 0, sizeof(buffer)); 30 fseek (fhandle,0L,SEEK_END);32 fseek(fhandle, 0L, SEEK_END); 31 33 length1 = ftell(fhandle); 32 fseek (fhandle,0L,SEEK_SET); 33 if (length1 < 13) 34 { 35 cs_log("min msg char in %s = 6, actual = %d",fname, length1-7); 34 fseek(fhandle, 0L, SEEK_SET); 35 36 if(length1 < 13) 37 { 38 cs_log("min msg char in %s = 6, actual = %d", fname, length1 - 7); 36 39 fclose(fhandle); 37 40 unlink(fname); 38 41 return -1; 39 } 40 if(fgets(buffer,140,fhandle) != NULL) 41 { 42 } 43 44 if(fgets(buffer, 140, fhandle) != NULL) 45 { 42 46 *boxid = strtol (buffer, &tail, 16); 43 47 *num = atoi (tail); 44 } 48 } 49 45 50 fclose(fhandle); 46 51 unlink(fname); 47 if (length1 > (127+7)) 52 53 if (length1 > (127 + 7)) 54 { 55 length = 127 + 7; 56 } 57 else 58 { 59 length = length1; 60 } 61 62 cs_log_dbg(D_READER, "total msg length taken from %s = %d, limitted to %d", fname, length1, length); 63 strncpy(text, &(buffer[7]), length - 7); 64 65 return 0; 66 } 67 static void write_gsms_to_osd_file(struct s_client *cli, uint8_t *gsms) 68 { 69 char *fext= FILE_OSD_MSG; 70 char *fname = get_gbox_tmp_fname(fext); 71 72 if(file_exists(fname)) 73 { 74 char gsms_buf[150]; 75 uint8_t i; 76 77 // allow only alphanumerical characters in osd gsms due to safety reasons 78 for(i = 0; i < strlen((char *)gsms); i++) 48 79 { 49 length = 127+7; 80 if(!isalnum(gsms[i]) && gsms[i] != ' ') 81 { gsms[i] = '_'; } 50 82 } 51 else 52 { 53 length = length1; 54 } 55 cs_log_dbg(D_READER, "total msg length taken from %s = %d, limitted to %d",fname, length1, length); 56 strncpy(text, &(buffer[7]),length-7); 57 return 0; 58 } 59 static void write_gsms_to_osd_file(struct s_client *cli, unsigned char *gsms) 60 { 61 char *fext= FILE_OSD_MSG; 62 char *fname = get_gbox_tmp_fname(fext); 63 if (file_exists(fname)) 64 { 65 char gsms_buf[150]; 66 uint8_t i; 67 // allow only alphanumerical characters in osd gsms due to safety reasons 68 for (i=0; i< strlen((char*)gsms); i++) 69 if (!isalnum(gsms[i]) && gsms[i] != ' ') 70 { gsms[i] = '_'; } 71 72 memset(gsms_buf, 0, sizeof(gsms_buf)); 73 snprintf(gsms_buf, sizeof(gsms_buf), "%s %s:%s %s", fname, username(cli), cli->reader->device, gsms); 74 cs_log_dbg(D_READER, "found OSD 'driver' %s - write gsms to OSD", fname); 75 char *cmd = gsms_buf; 83 84 memset(gsms_buf, 0, sizeof(gsms_buf)); 85 snprintf(gsms_buf, sizeof(gsms_buf), "%s %s:%s %s", fname, username(cli), cli->reader->device, gsms); 86 cs_log_dbg(D_READER, "found OSD 'driver' %s - write gsms to OSD", fname); 87 88 char *cmd = gsms_buf; 76 89 FILE *p; 77 90 if ((p = popen(cmd, "w")) == NULL) 78 91 { 79 cs_log("Error %s",fname);80 return;92 cs_log("Error %s",fname); 93 return; 81 94 } 82 95 pclose(p); 83 96 } 84 97 return; … … 91 104 cs_ctime_r(&walltime, tsbuf); 92 105 struct gbox_peer *peer = cli->gbox; 93 char *fext = FILE_GSMS_ACK;94 char *fname = get_gbox_tmp_fname(fext); 106 char *fext = FILE_GSMS_ACK; 107 char *fname = get_gbox_tmp_fname(fext); 95 108 FILE *fhandle = fopen(fname, "a+"); 96 109 if(!fhandle) … … 110 123 cs_ctime_r(&walltime, tsbuf); 111 124 struct gbox_peer *peer = cl->gbox; 112 char *fext= FILE_GSMS_NACK; 113 char *fname = get_gbox_tmp_fname(fext); 125 char *fext = FILE_GSMS_NACK; 126 char *fname = get_gbox_tmp_fname(fext); 127 114 128 FILE *fhandle = fopen(fname, "a+"); 115 129 if(!fhandle) … … 118 132 return; 119 133 } 134 120 135 if(inf) 121 136 { 122 fprintf(fhandle, "INFO: GSMS to all: Peer %04X (%s) was OFFLINE %s",peer->gbox.id, cl->reader->device,tsbuf); 137 fprintf(fhandle, "INFO: GSMS to all: Peer %04X (%s) was OFFLINE %s", 138 peer->gbox.id, cl->reader->device,tsbuf); 123 139 } 124 140 else 125 141 { 126 fprintf(fhandle, "WARNING: Private GSMS to Peer %04X (%s) failed - was OFFLINE %s",peer->gbox.id, cl->reader->device,tsbuf); 127 } 142 fprintf(fhandle, "WARNING: Private GSMS to Peer %04X (%s) failed - was OFFLINE %s", 143 peer->gbox.id, cl->reader->device,tsbuf); 144 } 145 128 146 fclose(fhandle); 129 147 return; 130 148 } 131 149 132 void write_gsms_msg (struct s_client *cli, u char*gsms, uint16_t type, uint16_t UNUSED(msglen))150 void write_gsms_msg (struct s_client *cli, uint8_t *gsms, uint16_t type, uint16_t UNUSED(msglen)) 133 151 { 134 152 char tsbuf[28]; … … 137 155 struct gbox_peer *peer = cli->gbox; 138 156 struct s_reader *rdr = cli->reader; 139 char *fext= FILE_GSMS_MSG; 140 char *fname = get_gbox_tmp_fname(fext); 157 char *fext = FILE_GSMS_MSG; 158 char *fname = get_gbox_tmp_fname(fext); 159 141 160 FILE *fhandle = fopen(fname, "a+"); 142 161 if(!fhandle) … … 145 164 return; 146 165 } 166 147 167 if(type == 0x30) 148 { 149 fprintf(fhandle, "Normal message received from %04X %s on %s%s\n\n",peer->gbox.id, cli->reader->device, tsbuf, gsms); 168 { 169 fprintf(fhandle, "Normal message received from %04X %s on %s%s\n\n", 170 peer->gbox.id, cli->reader->device, tsbuf, gsms); 150 171 rdr->gbox_gsms_peer = peer->gbox.id; 151 snprintf(rdr->last_gsms, sizeof(rdr->last_gsms), "%s %s", gsms, tsbuf); // for easy handling of gsms by webif152 172 snprintf(rdr->last_gsms, sizeof(rdr->last_gsms), "%s %s", gsms, tsbuf); // for easy handling of gsms by webif 173 } 153 174 else if(type == 0x31) 154 { 155 fprintf(fhandle, "OSD message received from %04X %s on %s%s\n\n",peer->gbox.id, cli->reader->device, tsbuf, gsms); 175 { 176 fprintf(fhandle, "OSD message received from %04X %s on %s%s\n\n", 177 peer->gbox.id, cli->reader->device, tsbuf, gsms); 156 178 write_gsms_to_osd_file(cli, gsms); 157 179 rdr->gbox_gsms_peer = peer->gbox.id; 158 snprintf(rdr->last_gsms, sizeof(rdr->last_gsms), "%s %s", gsms, tsbuf); //for easy handling of gsms by webif 159 } 160 else 161 {fprintf(fhandle, "Corrupted message received from %04X %s on %s%s\n\n",peer->gbox.id, cli->reader->device, tsbuf, gsms);} 162 fclose(fhandle); 180 snprintf(rdr->last_gsms, sizeof(rdr->last_gsms), "%s %s", gsms, tsbuf); // for easy handling of gsms by webif 181 } 182 else 183 { 184 fprintf(fhandle, "Corrupted message received from %04X %s on %s%s\n\n", 185 peer->gbox.id, cli->reader->device, tsbuf, gsms); 186 } 187 188 fclose(fhandle); 163 189 return; 164 190 } … … 171 197 static void gbox_send_gsms2peer(struct s_client *cl, char *gsms, uint8_t msg_type, int8_t gsms_len) 172 198 { 173 u charoutbuf[150];199 uint8_t outbuf[150]; 174 200 struct gbox_peer *peer = cl->gbox; 175 201 uint16_t local_gbox_id = gbox_get_local_gbox_id(); … … 193 219 { 194 220 uint8_t msg_type = 0, gsms_len = 0; 195 int peer_found =0;196 char text[GBOX_MAX_MSG_TXT +1];197 221 int peer_found = 0; 222 char text[GBOX_MAX_MSG_TXT + 1]; 223 198 224 memset(text, 0, sizeof(text)); 225 199 226 if(cfg.gsms_dis) 200 227 { … … 202 229 return 0; 203 230 } 231 204 232 gsms_len = strlen(gsms); 205 if(gsms_len <6)206 { 207 cs_log("GBOX: message to send to peer is too short 6 chars expected and %d received text e[%s]", gsms_len, gsms);208 } 209 else if(gsms_len >GBOX_MAX_MSG_TXT)210 { 211 gsms_len =GBOX_MAX_MSG_TXT;212 cs_log("GBOX message is too long so it will be truncated to max. [%d] .", GBOX_MAX_MSG_TXT);213 } 214 cs_strncpy(text,gsms,gsms_len +1);233 if(gsms_len < 6) 234 { 235 cs_log("GBOX: message to send to peer is too short 6 chars expected and %d received text[%s]", gsms_len, gsms); 236 } 237 else if(gsms_len > GBOX_MAX_MSG_TXT) 238 { 239 gsms_len = GBOX_MAX_MSG_TXT; 240 cs_log("GBOX message is too long so it will be truncated to max. [%d]", GBOX_MAX_MSG_TXT); 241 } 242 cs_strncpy(text,gsms,gsms_len + 1); 215 243 216 244 switch(num) 217 245 { 218 case 0: {msg_type = 0x30; break;} 219 case 1: {msg_type = 0x31; break;} 220 // case 2: {gsms_prot = 2; msg_type = 0x30; break;} 221 // case 3: {gsms_prot = 2; msg_type = 0x31; break;} 222 default:{cs_log("ERROR unknown gsms protocol"); return 0;} 223 } 224 cs_log_dbg(D_READER,"init gsms_length=%d msg_type=%02X ",gsms_len, msg_type); 246 case 0: 247 msg_type = 0x30; 248 break; 249 250 case 1: 251 msg_type = 0x31; 252 break; 253 254 //case 2: 255 // gsms_prot = 2; 256 // msg_type = 0x30; 257 // break; 258 259 //case 3: 260 // gsms_prot = 2; 261 // msg_type = 0x31; 262 // break; 263 264 default: 265 cs_log("ERROR unknown gsms protocol"); 266 return 0; 267 } 268 269 cs_log_dbg(D_READER,"init gsms_length=%d msg_type=%02X ", gsms_len, msg_type); 225 270 struct s_client *cl; 226 271 cs_readlock(__func__, &clientlist_lock); 272 227 273 for (cl = first_client; cl; cl = cl->next) 228 274 { … … 231 277 { 232 278 struct gbox_peer *peer = cl->gbox; 233 if (peer->online && boxid == 0xFFFF) // send gsms to all peers online279 if (peer->online && boxid == 0xFFFF) // send gsms to all peers online 234 280 { 235 281 gbox_send_gsms2peer(cl, text, msg_type, gsms_len); 236 282 peer_found=1; 237 283 } 284 238 285 if (!peer->online && boxid == 0xFFFF) 239 286 { 240 cs_log("GBOX Info: peer %04X is OFFLINE",peer->gbox.id); 241 write_gsms_nack( cl, 1); 242 } 287 cs_log("GBOX Info: peer %04X is OFFLINE", peer->gbox.id); 288 write_gsms_nack( cl, 1); 289 } 290 243 291 if (peer->online && boxid == peer->gbox.id) 244 292 { 245 293 gbox_send_gsms2peer(cl, text, msg_type, gsms_len); 246 peer_found=1; 247 } 294 peer_found=1; 295 } 296 248 297 if (!peer->online && boxid == peer->gbox.id) 249 298 { 250 cs_log("GBOX WARNING: send GSMS failed - peer %04X is OFFLINE", peer->gbox.id);251 write_gsms_nack( cl, 0); 299 cs_log("GBOX WARNING: send GSMS failed - peer %04X is OFFLINE", peer->gbox.id); 300 write_gsms_nack( cl, 0); 252 301 } 253 302 } … … 266 315 cfg.gbox_dest_peers[i]='\0'; 267 316 } 268 cfg.gbox_dest_peers_num =0;317 cfg.gbox_dest_peers_num = 0; 269 318 cs_readlock(__func__, &clientlist_lock); 270 for (cl = first_client; cl; cl = cl->next) 271 { 272 if((cl->gbox && cl->typ == 'p') && (n<GBOX_MAX_DEST_PEERS)) 319 320 for(cl = first_client; cl; cl = cl->next) 321 { 322 if((cl->gbox && cl->typ == 'p') && (n < GBOX_MAX_DEST_PEERS)) 273 323 { 274 324 struct gbox_peer *peer = cl->gbox; 275 if (peer->online) // peer is online325 if (peer->online) // peer is online 276 326 { 277 327 cfg.gbox_dest_peers[n++] = (peer->gbox.id); … … 279 329 } 280 330 } 281 cs_readunlock(__func__, &clientlist_lock); 331 332 cs_readunlock(__func__, &clientlist_lock); 282 333 cfg.gbox_dest_peers_num = n; 283 334 return; … … 292 343 char text[150]; 293 344 memset(text, 0, sizeof(text)); 294 char *fext= FILE_GSMS_TXT; 295 char *fname = get_gbox_tmp_fname(fext); 345 char *fext = FILE_GSMS_TXT; 346 char *fname = get_gbox_tmp_fname(fext); 347 296 348 if(cfg.gsms_dis) 297 349 { 298 unlink(fname); 299 gsms_unavail(); 300 return; 301 } 350 unlink(fname); 351 gsms_unavail(); 352 return; 353 } 354 302 355 poll_result = poll_gsms_data( &boxid, &num, text); 303 356 if(poll_result) 304 357 { 305 if(poll_result != -2) 306 { cs_log("ERROR polling file %s", fname); } 307 return; 308 } 358 if(poll_result != -2) 359 { cs_log("ERROR polling file %s", fname); } 360 return; 361 } 362 309 363 int8_t gsms_len = strlen(text); 310 cs_log_dbg(D_READER,"got from %s: box_ID = %04X num = %d gsms_length = %d txt = %s",fname, boxid, num, gsms_len, text); 364 cs_log_dbg(D_READER,"got from %s: box_ID = %04X num = %d gsms_length = %d txt = %s", 365 fname, boxid, num, gsms_len, text); 311 366 312 367 switch(num) 313 368 { 314 case 0: {msg_type = 0x30; break;} 315 case 1: {msg_type = 0x31; break;} 316 // case 2: {gsms_prot = 2; msg_type = 0x30; break;} 317 // case 3: {gsms_prot = 2; msg_type = 0x31; break;} 318 default:{cs_log("ERROR unknown gsms protocol"); return;} 319 } 320 cs_log_dbg(D_READER,"init gsms to boxid= %04X length= %d msg_type= %02X ",boxid, gsms_len, msg_type); 369 case 0: 370 msg_type = 0x30; 371 break; 372 373 case 1: 374 msg_type = 0x31; 375 break; 376 377 //case 2: 378 // gsms_prot = 2; 379 // msg_type = 0x30; 380 // break; 381 382 //case 3: 383 // gsms_prot = 2; 384 // msg_type = 0x31; 385 // break; 386 387 default: 388 cs_log("ERROR unknown gsms protocol"); 389 return; 390 } 391 392 cs_log_dbg(D_READER,"init gsms to boxid= %04X length= %d msg_type= %02X ", 393 boxid, gsms_len, msg_type); 321 394 322 395 uint8_t id_valid = 0; 323 396 struct s_client *cl; 324 397 cs_readlock(__func__, &clientlist_lock); 325 for (cl = first_client; cl; cl = cl->next) 398 399 for(cl = first_client; cl; cl = cl->next) 326 400 { 327 401 if(cl->gbox && cl->typ == 'p') 328 402 { 329 403 struct gbox_peer *peer = cl->gbox; 330 331 if (peer->online && boxid == 0xFFFF) //send gsms to all peers online 332 { 333 gbox_send_gsms2peer(cl, text, msg_type, gsms_len); 334 id_valid = 1; 335 } 336 if (!peer->online && boxid == 0xFFFF) 337 { 338 cs_log("Info: peer %04X is OFFLINE",peer->gbox.id); 339 write_gsms_nack( cl, 1); 340 id_valid = 1; 341 } 342 if (peer->online && boxid == peer->gbox.id) 343 { 344 gbox_send_gsms2peer(cl, text, msg_type, gsms_len); 345 id_valid = 1; 346 } 347 if (!peer->online && boxid == peer->gbox.id) 348 { 349 cs_log("WARNING: send GSMS failed - peer %04X is OFFLINE",peer->gbox.id); 350 write_gsms_nack( cl, 0); 351 id_valid = 1; 404 405 if(peer->online && boxid == 0xFFFF) // send gsms to all peers online 406 { 407 gbox_send_gsms2peer(cl, text, msg_type, gsms_len); 408 id_valid = 1; 409 } 410 411 if(!peer->online && boxid == 0xFFFF) 412 { 413 cs_log("Info: peer %04X is OFFLINE", peer->gbox.id); 414 write_gsms_nack( cl, 1); 415 id_valid = 1; 416 } 417 418 if(peer->online && boxid == peer->gbox.id) 419 { 420 gbox_send_gsms2peer(cl, text, msg_type, gsms_len); 421 id_valid = 1; 422 } 423 424 if(!peer->online && boxid == peer->gbox.id) 425 { 426 cs_log("WARNING: send GSMS failed - peer %04X is OFFLINE", peer->gbox.id); 427 write_gsms_nack( cl, 0); 428 id_valid = 1; 352 429 } 353 430 } 354 431 } 355 432 cs_readunlock(__func__, &clientlist_lock); 356 if (!id_valid) 357 { 358 cs_log("WARNING: send GSMS failed - peer_id unknown"); 359 } 433 434 if(!id_valid) 435 { 436 cs_log("WARNING: send GSMS failed - peer_id unknown"); 437 } 360 438 return; 361 439 } … … 363 441 void gbox_send_gsms_ack(struct s_client *cli) 364 442 { 365 u charoutbuf[20];443 uint8_t outbuf[20]; 366 444 struct gbox_peer *peer = cli->gbox; 367 445 uint16_t local_gbox_id = gbox_get_local_gbox_id(); … … 369 447 struct s_reader *rdr = cli->reader; 370 448 371 372 449 if (peer->online) 450 { 373 451 gbox_message_header(outbuf, MSG_GSMS_ACK, peer->gbox.password, local_gbox_pw); 374 452 outbuf[10] = 0; … … 378 456 outbuf[14] = 0x1; 379 457 outbuf[15] = 0; 380 cs_log_dbg(D_READER,"<-[gbx] send GSMS_ACK to %s:%d id: %04X",rdr->device, rdr->r_port, peer->gbox.id); 458 cs_log_dbg(D_READER,"<-[gbx] send GSMS_ACK to %s:%d id: %04X", 459 rdr->device, rdr->r_port, peer->gbox.id); 381 460 gbox_send(cli, outbuf, 16); 382 461 } 383 462 } 384 463 … … 392 471 { 393 472 static int8_t mutex_init = 0; 394 395 473 if(!mutex_init) 396 474 { … … 398 476 cs_pthread_cond_init(__func__, &sleep_cond_mutex, &sleep_cond); 399 477 mutex_init = 1; 400 } 478 } 401 479 } 402 480 403 481 static void sms_sender(void) 404 482 { 405 406 char *fname = get_gbox_tmp_fname(fext); 407 483 char *fext= FILE_GSMS_TXT; 484 char *fname = get_gbox_tmp_fname(fext); 485 408 486 while(sms_sender_active) 409 487 { 410 411 488 if (file_exists(fname)) 489 { 412 490 gbox_init_send_gsms(); 413 } 414 491 } 492 415 493 sleepms_on_cond(__func__, &sleep_cond_mutex, &sleep_cond, 1000); 416 494 } … … 421 499 { 422 500 int32_t is_active; 423 501 424 502 sms_mutex_init(); 425 426 503 SAFE_MUTEX_LOCK(&sms_mutex); 504 427 505 is_active = sms_sender_active; 428 506 if(!sms_sender_active) … … 430 508 sms_sender_active = 1; 431 509 } 432 510 433 511 if(is_active || cfg.gsms_dis) 434 512 { 435 513 SAFE_MUTEX_UNLOCK(&sms_mutex); 436 return; 437 } 438 514 return; 515 } 516 439 517 int32_t ret = start_thread("sms sender", (void *)&sms_sender, NULL, &sms_sender_thread, 0, 1); 440 518 if(ret) … … 442 520 sms_sender_active = 0; 443 521 } 444 522 445 523 SAFE_MUTEX_UNLOCK(&sms_mutex); 446 524 } … … 449 527 { 450 528 sms_mutex_init(); 451 452 529 SAFE_MUTEX_LOCK(&sms_mutex); 453 530 454 531 if(sms_sender_active) 455 532 { … … 458 535 SAFE_THREAD_JOIN(sms_sender_thread, NULL); 459 536 } 460 537 461 538 SAFE_MUTEX_UNLOCK(&sms_mutex); 462 539 } 463 540 464 465 541 #endif
Note:
See TracChangeset
for help on using the changeset viewer.