source: branches/fscctrl_safety_limits/dim/src/webDid/webDid.c@ 19365

Last change on this file since 19365 was 18058, checked in by tbretz, 10 years ago
Updated to v20r11
File size: 51.0 KB
Line 
1#include <stdio.h>
2#include <ctype.h>
3#include <time.h>
4#include <dim.h>
5#include <dic.h>
6#include <dis.h>
7
8extern int WebDID_Debug;
9
10typedef struct item{
11 struct item *next;
12 DNS_SERVER_INFO server;
13 DNS_SERVICE_INFO *service_ptr;
14 char name[MAX_NAME];
15 int match;
16 int busy;
17 int isSMI;
18}SERVER;
19
20typedef struct nitem{
21 struct nitem *next;
22 SERVER *server_head;
23 char name[MAX_NAME];
24 int match;
25 int busy;
26 int hasSMI;
27}NODE;
28NODE *Node_head = (NODE *)0;
29
30typedef struct sitem{
31 struct sitem *next;
32 char name[MAX_NAME];
33 int sid;
34 void *buffer;
35 int buffer_size;
36 int size;
37 time_t timestamp;
38 void *buffer_str;
39 int buffer_str_size;
40 int str_size;
41 int conn_id;
42 time_t last_subscribed;
43 time_t last_updated;
44 int n_browsers;
45}CURR_SERVICE;
46CURR_SERVICE *Curr_service_head = (CURR_SERVICE *)0;
47
48typedef struct objstate{
49 char name[MAX_NAME];
50 char state[512];
51 int sid;
52 int mode_index;
53 void *browserp;
54}OBJSTATE;
55/*
56typedef struct domainitem{
57 char name[MAX_NAME];
58 OBJSTATE objs[1];
59}CURR_SMIDOMAIN;
60*/
61typedef struct bitem{
62 struct bitem *next;
63 int id;
64 int subscribe;
65 time_t last_subscribed;
66 time_t last_updated;
67 time_t last_polled;
68 time_t last_changed;
69 int conn_id;
70 int n_services;
71 int n_servers;
72 int n_nodes;
73 CURR_SERVICE *servicep;
74 char *JSONBuffer;
75 int JSONBufferSize;
76 char *JSONSmiBuffer;
77 int JSONSmiBufferSize;
78 char pattern[256];
79 char curr_command[MAX_NAME];
80 char *service_format_ptr;
81 int isSMI;
82 int n_domains;
83 char curr_smidomain[MAX_NAME];
84 int curr_smidomain_size;
85 int curr_smidomain_nobjs;
86 OBJSTATE *smidomainp;
87}BROWSER;
88BROWSER *Browser_head = (BROWSER *)0;
89
90char *JSONBuffer = 0;
91int JSONBufferSize = 0;
92char JSONHeader[256] = {'\0'};
93char JSONSmiHeader[256] = {'\0'};
94
95char *JSONSmiBuffer = 0;
96int JSONSmiBufferSize = 0;
97
98int First_time = 1;
99int Curr_view_opt = -1;
100char Curr_view_opt_par[80];
101char Curr_service_name[132];
102char Curr_service_format[256];
103int Curr_service_print_type = 0;
104int N_nodes = 0;
105int N_servers = 0;
106int N_services = 0;
107static char no_link = -1;
108static char no_link_str[5] = "DEAD";
109int no_link_int = -1;
110FILE *fptr;
111
112char *Service_content_str;
113char *Curr_service_list = 0;
114char *Curr_client_list = 0;
115int Curr_service_id = 0;
116SERVER *Got_Service_List = 0;
117SERVER *Got_Client_List = 0;
118
119int Timer_q;
120char Title[128];
121
122int did_init(char *local_node, int dns_port)
123{
124 void update_servers();
125 char icon_title[128];
126 char dns_node[128];
127 int ret;
128
129 dim_init();
130 dic_disable_padding();
131 dis_disable_padding();
132
133 ret = dim_get_dns_node(dns_node);
134 if(!ret)
135 {
136 strcpy(dns_node, local_node);
137 dim_set_dns_node(dns_node);
138 }
139 dns_port = dic_get_dns_port();
140 if(dns_port != DNS_PORT)
141 {
142 sprintf(Title,"DIM DNS: %s:%d",dns_node,dns_port);
143 }
144 else
145 {
146 sprintf(Title,"DIM DNS: %s",dns_node);
147 }
148 sprintf(icon_title,"DID %s",dns_node);
149dim_print_date_time();
150printf("webDid Starting up on %s\n\t serving %s\n", local_node, Title);
151 Timer_q = dtq_create();
152 dic_info_service("DIS_DNS/SERVER_INFO",MONITORED,0,0,0,update_servers,0,
153 &no_link,1);
154 return 1;
155}
156
157SERVER *find_server(NODE *nodep, int pid)
158{
159 SERVER *servp;
160 DNS_SERVER_INFO *ptr;
161
162 servp = nodep->server_head;
163 while( (servp = (SERVER *)sll_get_next((SLL *)servp)) )
164 {
165 ptr = &servp->server;
166 if(ptr->pid == pid)
167 {
168 return(servp);
169 }
170 }
171 return ((SERVER *)0);
172}
173
174NODE *find_node(char *node)
175{
176 NODE *nodep;
177
178 nodep = Node_head;
179 while( (nodep = (NODE *)sll_get_next((SLL *)nodep)) )
180 {
181 if(!strcmp(nodep->name,node))
182 {
183 return(nodep);
184 }
185 }
186 return ((NODE *)0);
187}
188
189int find_server_service_pattern(SERVER *servp, char *pattern)
190{
191 DNS_SERVICE_INFO *servicep;
192 int n_services, i;
193 int n_found = 0;
194
195 servicep = servp->service_ptr;
196 n_services = servp->server.n_services;
197 for(i = 0; i < n_services; i++)
198 {
199 if(strstr(servicep->name, pattern))
200 {
201 n_found++;
202 }
203 servicep++;
204 }
205 return(n_found);
206}
207
208int find_service_pattern(NODE *nodep, SERVER *servpp, char *pattern, int *n_servers)
209{
210 SERVER *servp;
211 int ret, n_found = 0;
212 int n_servers_found = 0;
213
214 if(!servpp)
215 {
216 servp = nodep->server_head;
217 while( (servp = (SERVER *)sll_get_next((SLL *)servp)) )
218 {
219 if((ret = find_server_service_pattern(servp, pattern)))
220 {
221 n_found += ret;
222 n_servers_found++;
223 }
224 }
225 }
226 else
227 {
228 if((ret = find_server_service_pattern(servpp, pattern)))
229 {
230 n_found += ret;
231 }
232 }
233 if(n_servers != 0)
234 *n_servers = n_servers_found;
235 return(n_found);
236}
237
238CURR_SERVICE *find_curr_service(char *service)
239{
240 CURR_SERVICE *servicep;
241
242 servicep = Curr_service_head ;
243 while( (servicep = (CURR_SERVICE *)sll_get_next((SLL *)servicep)) )
244 {
245 if(!strcmp(servicep->name,service))
246 {
247 return(servicep);
248 }
249 }
250 return ((CURR_SERVICE *)0);
251}
252
253BROWSER *find_browser(int id)
254{
255 BROWSER *browserp;
256
257 browserp = Browser_head;
258 while( (browserp = (BROWSER *)sll_get_next((SLL *)browserp)) )
259 {
260 if(browserp->id == id)
261 {
262 return(browserp);
263 }
264 }
265 return ((BROWSER *)0);
266}
267/*
268void set_browser_changes(int n_services, int n_servers, int n_nodes)
269{
270 BROWSER *browserp;
271
272 browserp = Browser_head;
273 while( (browserp = (BROWSER *)sll_get_next((SLL *)browserp)) )
274 {
275 if(browserp->n_services != n_services)
276 browserp->n_services_changed = 1;
277 if(browserp->n_servers != n_servers)
278 browserp->n_servers_changed = 1;
279 if(browserp->n_nodes != n_nodes)
280 browserp->n_nodes_changed = 1;
281 }
282}
283*/
284void prepare_browser_tree()
285{
286 BROWSER *browserp;
287 int prepareJSONTree();
288
289 browserp = Browser_head;
290 while( (browserp = (BROWSER *)sll_get_next((SLL *)browserp)) )
291 {
292 if(browserp->pattern[0] != '\0')
293 prepareJSONTree(browserp);
294 }
295}
296/*
297void clear_browser_changes(BROWSER *browserp)
298{
299 browserp->n_services_changed = 0;
300 browserp->n_servers_changed = 0;
301 browserp->n_nodes_changed = 0;
302}
303*/
304void update_servers(int *tag, DNS_DID *buffer, int *size)
305{
306int n_services, service_size;
307SERVER *servp;
308NODE *nodep;
309int j;
310char str[MAX_NAME], sname[MAX_NAME], *ptr;
311int prepareJSONTree();
312int prepareJSONHeader();
313
314 if(tag){}
315 if(!Node_head)
316 {
317 Node_head = (NODE *)malloc(sizeof(NODE));
318 sll_init((SLL *)Node_head);
319 }
320 if(First_time)
321 {
322 First_time = 0;
323 }
324
325 if(!*size)
326 return;
327 if(*(char *)buffer == -1)
328 {
329 N_servers = 0;
330 N_services = 0;
331 return;
332 }
333 buffer->server.n_services = vtohl(buffer->server.n_services);
334 buffer->server.pid = vtohl(buffer->server.pid);
335 n_services = buffer->server.n_services;
336
337 if(n_services == 1)
338 return;
339 strcpy(sname, buffer->server.task);
340 if(n_services > 1)
341 {
342 for(j = 0; j < n_services; j++)
343 {
344 buffer->services[j].type = vtohl(
345 buffer->services[j].type);
346 buffer->services[j].status = vtohl(
347 buffer->services[j].status);
348 buffer->services[j].n_clients = vtohl(
349 buffer->services[j].n_clients);
350 if((int)strlen(sname) == MAX_TASK_NAME-4-1)
351 {
352 strcpy(str,buffer->services[j].name);
353 if( (ptr = strstr(str,"/CLIENT_LIST")) )
354 {
355 *ptr = '\0';
356 strcpy(sname,str);
357 }
358 }
359 }
360 }
361 if (!(nodep = find_node(buffer->server.node)))
362 {
363 if(n_services)
364 {
365 N_nodes++;
366 nodep = (NODE *)malloc(sizeof(NODE));
367 strcpy(nodep->name,buffer->server.node);
368 nodep->hasSMI = 0;
369 nodep->server_head = (SERVER *)malloc(sizeof(SERVER));
370 sll_init((SLL *)nodep->server_head);
371 sll_insert_queue((SLL *)Node_head,(SLL *)nodep);
372 }
373 }
374 if (!(servp = find_server(nodep,buffer->server.pid)))
375 {
376 if(n_services)
377 {
378 servp = (SERVER *)malloc(sizeof(SERVER));
379 strcpy(servp->name,sname);
380 servp->next = 0;
381 servp->busy = 0;
382 servp->server.n_services = 0;
383 servp->service_ptr = 0;
384 servp->isSMI = 0;
385 if(strstr(sname,"_SMI"))
386 {
387 servp->isSMI = 1;
388 nodep->hasSMI = 1;
389 }
390 sll_insert_queue((SLL *)nodep->server_head,(SLL *)servp);
391 }
392 }
393 if(n_services != 0)
394 {
395 if(n_services == servp->server.n_services)
396 {
397 return;
398 }
399 if(servp->server.n_services == 0)
400 N_servers++;
401 if(servp->server.n_services != -1)
402 N_services -= servp->server.n_services;
403 memcpy(&servp->server,&buffer->server,sizeof(DNS_SERVER_INFO));
404 if(servp->service_ptr)
405 {
406 free(servp->service_ptr);
407 servp->service_ptr = 0;
408 }
409 if(n_services != -1)
410 {
411 service_size = n_services*(int)sizeof(DNS_SERVICE_INFO);
412 servp->service_ptr = (DNS_SERVICE_INFO *)malloc((size_t)service_size);
413 memcpy(servp->service_ptr, buffer->services, (size_t)service_size);
414 N_services += n_services;
415 }
416 servp->busy = 1;
417 }
418 else
419 {
420 if(servp)
421 {
422 N_servers--;
423 if(servp->server.n_services != -1)
424 {
425 N_services -= servp->server.n_services;
426 }
427 servp->server.n_services = 0;
428 servp->busy = -1;
429 servp->isSMI = 0;
430 }
431 }
432 if(JSONHeader[0])
433 prepareJSONHeader();
434}
435
436void got_update_services(BROWSER **tag, char *buffer, int *size)
437{
438 BROWSER *browserp;
439
440 if(size){}
441 browserp = (BROWSER *)*tag;
442 if(browserp->service_format_ptr)
443 free(browserp->service_format_ptr);
444 browserp->service_format_ptr = (char *)malloc(strlen(buffer)+1);
445 strcpy(browserp->service_format_ptr, buffer);
446}
447
448char *update_services(char *node, char *server, int pid, int browser)
449{
450 char str[MAX_NAME];
451 NODE *nodep;
452 SERVER *servp;
453 char *ptr = 0;
454 BROWSER *browserp;
455 char *prepareJSONServiceList();
456 BROWSER *create_browser();
457
458 if(!(browserp = find_browser(browser)))
459 browserp = create_browser(browser);
460
461 if(server){}
462 sprintf(str,"%s/SERVICE_LIST",server);
463 dic_info_service(str,ONCE_ONLY,20,0,0,
464 got_update_services,(dim_long)browserp,"None",5);
465 if((nodep = find_node(node)))
466 {
467 if((servp = find_server(nodep, pid)))
468 {
469 ptr = prepareJSONServiceList(servp, node, pid, browserp);
470 }
471 }
472 return ptr;
473}
474
475void got_update_smi_objects(BROWSER **tag, char *buffer, int *size)
476{
477 BROWSER *browserp;
478
479 if(size){}
480 browserp = (BROWSER *)*tag;
481 if(browserp->service_format_ptr)
482 free(browserp->service_format_ptr);
483 browserp->service_format_ptr = (char *)malloc(strlen(buffer)+1);
484 strcpy(browserp->service_format_ptr, buffer);
485}
486
487char *update_smi_objects(char *node, char *server, int pid, int browser)
488{
489 char str[MAX_NAME];
490 NODE *nodep;
491 SERVER *servp;
492 char *ptr = 0;
493 BROWSER *browserp;
494 char *prepareJSONSmiObjectList();
495 BROWSER *create_browser();
496
497 if(!(browserp = find_browser(browser)))
498 {
499 browserp = create_browser(browser);
500 browserp->isSMI = 1;
501 }
502 if(server){}
503 sprintf(str,"%s/SERVICE_LIST",server);
504 dic_info_service(str,ONCE_ONLY,20,0,0,
505 got_update_smi_objects,(dim_long)browserp,"None",5);
506 if((nodep = find_node(node)))
507 {
508 if((servp = find_server(nodep, pid)))
509 {
510 ptr = prepareJSONSmiObjectList(servp, node, pid, browserp);
511 }
512 }
513 return ptr;
514}
515
516void get_curr_service_format()
517{
518 char *format;
519 char *dic_get_format();
520/*
521 char str[256], *ptr, *ptr1;
522 int rpc_flag;
523
524 strcpy(str,Curr_service_name);
525 rpc_flag = 0;
526 if( (ptr = strstr(str,"/RpcIn")) )
527 {
528 *ptr = '\0';
529 rpc_flag = 1;
530 }
531 if( (ptr = strstr(str,"/RpcOut")) )
532 {
533 *ptr = '\0';
534 rpc_flag = 2;
535 }
536 strcat(str,"|");
537*/
538 format = dic_get_format(0);
539/*
540 if( (ptr = strstr(Curr_service_list,str)) )
541 {
542 if(!rpc_flag)
543 {
544 ptr += (int)strlen(str);
545 ptr1 = strchr(ptr,'|');
546 }
547 else if(rpc_flag == 1)
548 {
549 ptr += (int)strlen(str);
550 ptr1 = strchr(ptr,',');
551 }
552 else
553 {
554 ptr += (int)strlen(str);
555 ptr = strchr(ptr,',');
556 ptr++;
557 ptr1 = strchr(ptr,'|');
558 }
559 strncpy(Curr_service_format,ptr,(int)(ptr1 - ptr));
560 Curr_service_format[(int)(ptr1-ptr)] = '\0';
561 }
562*/
563 if(format)
564 strcpy(Curr_service_format,format);
565 else
566 Curr_service_format[0] = '\0';
567}
568
569void get_service_format(char *buffer, char *service, char *format)
570{
571 char str[256], *ptr, *ptr1;
572 int rpc_flag;
573
574 strcpy(str, service);
575 rpc_flag = 0;
576 *format = '\0';
577 if( (ptr = strstr(str,"/RpcIn")) )
578 {
579 *ptr = '\0';
580 rpc_flag = 1;
581 }
582 if( (ptr = strstr(str,"/RpcOut")) )
583 {
584 *ptr = '\0';
585 rpc_flag = 2;
586 }
587 strcat(str,"|");
588 if( (ptr = strstr(buffer, str)) )
589 {
590 if(!rpc_flag)
591 {
592 ptr += (int)strlen(str);
593 ptr1 = strchr(ptr,'|');
594 }
595 else if(rpc_flag == 1)
596 {
597 ptr += (int)strlen(str);
598 ptr1 = strchr(ptr,',');
599 }
600 else
601 {
602 ptr += (int)strlen(str);
603 ptr = strchr(ptr,',');
604 ptr++;
605 ptr1 = strchr(ptr,'|');
606 }
607 strncpy(format,ptr,(size_t)(ptr1 - ptr));
608 format[(int)(ptr1-ptr)] = '\0';
609 }
610}
611
612int delete_curr_service(CURR_SERVICE *servicep)
613{
614
615if(WebDID_Debug)
616printf("\nUnsubscribing %s\n\n",servicep->name);
617 dic_release_service(servicep->sid);
618 if(servicep->buffer_size)
619 free(servicep->buffer);
620 if(servicep->buffer_str_size)
621 free(servicep->buffer_str);
622 sll_remove((SLL *)Curr_service_head, (SLL *)servicep);
623 free(servicep);
624 return(1);
625}
626
627int delete_browser(BROWSER *browserp)
628{
629 CURR_SERVICE *servicep;
630
631 if((servicep = browserp->servicep))
632 {
633 servicep->n_browsers--;
634 if(!servicep->n_browsers)
635 delete_curr_service(servicep);
636 }
637 if(browserp->service_format_ptr)
638 free(browserp->service_format_ptr);
639 sll_remove((SLL *)Browser_head, (SLL *)browserp);
640 free(browserp);
641 return(1);
642}
643
644void check_browser( BROWSER *tag)
645{
646 BROWSER *browserp;
647 time_t tsecs;
648
649 browserp = (BROWSER *)tag;
650if(WebDID_Debug)
651printf("\nCheck_browser %d\n",browserp->id);
652 tsecs = time((time_t *)0);
653 if((tsecs - browserp->last_polled) > 20)
654 {
655if(WebDID_Debug)
656printf("\nDeleting browser %d\n\n",browserp->id);
657 delete_browser(browserp);
658 }
659 else
660 dtq_start_timer(10, check_browser, browserp);
661}
662
663BROWSER *create_browser(int id)
664{
665 BROWSER *browserp;
666
667 if(!Browser_head)
668 {
669 Browser_head = (BROWSER *)malloc(sizeof(BROWSER));
670 sll_init((SLL *)Browser_head);
671 }
672 browserp = (BROWSER *)malloc(sizeof(BROWSER));
673 browserp->id = id;
674 browserp->last_subscribed = 0;
675 browserp->last_updated = 0;
676 browserp->last_polled = 0;
677 browserp->last_changed = 0;
678 browserp->n_nodes = 0;
679 browserp->n_servers = 0;
680 browserp->n_services = 0;
681 browserp->servicep = 0;
682 browserp->JSONBuffer = 0;
683 browserp->JSONBufferSize = 0;
684 browserp->JSONSmiBuffer = 0;
685 browserp->JSONSmiBufferSize = 0;
686 browserp->pattern[0] = '\0';
687 browserp->service_format_ptr = 0;
688 browserp->curr_command[0] = '\0';
689 browserp->curr_smidomain[0] = '\0';
690 browserp->smidomainp = 0;
691 sll_insert_queue((SLL *)Browser_head,(SLL *)browserp);
692 dtq_start_timer(10, check_browser, browserp);
693 return browserp;
694}
695
696int update_command_data(char *service, int conn_id, BROWSER *browserp)
697{
698 char format[MAX_NAME];
699 char answer[MAX_NAME*3];
700 extern void sendData();
701
702 if(browserp->service_format_ptr)
703 {
704 get_service_format(browserp->service_format_ptr, service, format);
705if(WebDID_Debug)
706printf("CMD data %s %s\n",service,format);
707 }
708 else
709 {
710 strcpy(format,"?");
711 }
712 strcpy(browserp->curr_command, service);
713 sprintf(answer,"To %s (%s)",service, format);
714 sendData(conn_id, answer, 4);
715 return 1;
716}
717
718int update_service_data(char *service, int conn_id, int subscribe, int req, int browser, int force)
719{
720 CURR_SERVICE *servicep;
721 time_t tsecs;
722 void recv_service_info();
723 extern void sendData();
724 BROWSER *browserp;
725
726 if(req){}
727 if(!Curr_service_head)
728 {
729 Curr_service_head = (CURR_SERVICE *)malloc(sizeof(CURR_SERVICE));
730 sll_init((SLL *)Curr_service_head);
731 }
732 if(!(browserp = find_browser(browser)))
733 browserp = create_browser(browser);
734 if(force == -1)
735 {
736 update_command_data(service, conn_id, browserp);
737 return 1;
738 }
739 if((servicep = browserp->servicep))
740 {
741 servicep->n_browsers--;
742 if(!servicep->n_browsers)
743 delete_curr_service(servicep);
744 }
745 if(!(servicep = find_curr_service(service)))
746 {
747 servicep = (CURR_SERVICE *)malloc(sizeof(CURR_SERVICE));
748 strcpy(servicep->name,service);
749 servicep->conn_id = conn_id;
750 servicep->buffer = 0;
751 servicep->buffer_size = 0;
752 servicep->size = 0;
753 servicep->buffer_str = 0;
754 servicep->buffer_str_size = 0;
755 servicep->str_size = 0;
756 servicep->last_updated = 0;
757 tsecs = time((time_t *)0);
758 browserp->last_subscribed = tsecs;
759 browserp->last_updated = tsecs;
760 servicep->last_subscribed = tsecs;
761 servicep->n_browsers = 0;
762 sll_insert_queue((SLL *)Curr_service_head,(SLL *)servicep);
763 servicep->sid = (int)dic_info_service_stamped( service, MONITORED, subscribe, 0, 0,
764 recv_service_info, servicep, &no_link_int, 4);
765 }
766 else
767 {
768 if(servicep->size)
769 {
770 if((servicep->timestamp > browserp->last_updated) || (force))
771 {
772 sendData(conn_id, servicep->buffer_str, 4);
773 }
774 else
775 {
776 sendData(conn_id, "", 4);
777 }
778 browserp->last_updated = servicep->timestamp;
779 }
780 }
781 if(force)
782 {
783 browserp->servicep = servicep;
784 servicep->n_browsers++;
785 }
786 return 1;
787}
788
789int check_browser_changes(char *service, int conn_id, int subscribe, int req, int browser, int force)
790{
791 CURR_SERVICE *servicep;
792 time_t tsecs;
793 void recv_service_info();
794 extern void sendData();
795 BROWSER *browserp;
796 char answer[256];
797 int service_changed = 0;
798
799 if(req){}
800 if(subscribe){}
801 if(!(browserp = find_browser(browser)))
802 browserp = create_browser(browser);
803 if(!Curr_service_head)
804 {
805 Curr_service_head = (CURR_SERVICE *)malloc(sizeof(CURR_SERVICE));
806 sll_init((SLL *)Curr_service_head);
807 }
808 if(service[0] != '\0')
809 {
810 if((servicep = find_curr_service(service)))
811 {
812 if(servicep->size)
813 {
814 if((servicep->timestamp > browserp->last_updated) || (force))
815 {
816 service_changed = 1;
817 }
818 }
819 }
820 }
821 if(browserp->isSMI)
822 {
823 if((browserp->last_changed >= browserp->last_polled) || (force))
824 {
825 service_changed = 1;
826 }
827 }
828/*
829 sprintf(answer,"%d %d %d %d\n",
830 browserp->n_services_changed, browserp->n_servers_changed,
831 browserp->n_nodes_changed, service_changed);
832*/
833 sprintf(answer,"%d %d %d %d %d %d %d\n",
834 N_services, N_servers, N_nodes, service_changed,
835 browserp->n_services, browserp->n_servers, browserp->n_nodes);
836 sendData(conn_id, answer, 4);
837 tsecs = time((time_t *)0);
838 browserp->last_polled = tsecs;
839 return 1;
840}
841
842int find_services(char *pattern, int conn_id, int browser, int force)
843{
844 void recv_service_info();
845 extern void sendData();
846 BROWSER *browserp;
847 char format[MAX_NAME];
848 int prepareJSONTree();
849 void did_prepare_command();
850
851 if(conn_id){}
852 if(!(browserp = find_browser(browser)))
853 browserp = create_browser(browser);
854 if(force == -1)
855 {
856 if(browserp->service_format_ptr)
857 {
858 get_service_format(browserp->service_format_ptr, browserp->curr_command, format);
859 did_prepare_command(pattern, browserp->curr_command, format);
860 }
861 return 1;
862 }
863 if(conn_id){}
864 if(!(browserp = find_browser(browser)))
865 browserp = create_browser(browser);
866 strcpy(browserp->pattern, pattern);
867 return 1;
868}
869
870void recv_service_info(void **tag, int *buffer, int *size)
871{
872 int conn_id;
873 void print_service_formatted();
874 extern void sendData();
875 CURR_SERVICE *servicep;
876 time_t tsecs;
877
878 servicep = *tag;
879 conn_id = servicep->conn_id;
880 if (servicep->buffer_size < *size)
881 {
882 if(servicep->buffer_size)
883 free(servicep->buffer);
884 servicep->buffer = malloc((size_t)*size);
885 servicep->buffer_size = *size;
886 }
887 memcpy(servicep->buffer, (char *)buffer, (size_t)*size);
888 servicep->size = *size;
889 if (servicep->buffer_str_size < (1024 + (*size)*16))
890 {
891 if(servicep->buffer_str_size)
892 free(servicep->buffer_str);
893 servicep->buffer_str = malloc((size_t)(1024 + (*size)*16));
894 servicep->buffer_str_size = 1024 + (*size)*16;
895 }
896 Service_content_str = servicep->buffer_str;
897 strcpy(Curr_service_name, servicep->name);
898 get_curr_service_format();
899 if((*size == 4 ) && (*buffer == -1))
900 {
901 sprintf(Service_content_str,
902 "Service %s Not Available", Curr_service_name);
903 }
904 else
905 {
906 print_service_formatted(servicep, buffer, *size);
907 }
908 if(servicep->last_updated == 0)
909 {
910 sendData(conn_id, Service_content_str, 4);
911 tsecs = time((time_t *)0);
912 servicep->last_updated = tsecs;
913 }
914}
915
916void print_service_formatted(CURR_SERVICE *servicep, void *buff, int size)
917{
918char type;
919int num, ret;
920char str[256];
921char *ptr;
922void *buffer_ptr;
923char timestr[256], aux[64], sizestr[64];
924int quality = 0, secs = 0, mili = 0;
925int did_write_string(char, int, void **, int);
926time_t tsecs;
927
928 if(size < 1024)
929 sprintf(sizestr,"%d bytes",size);
930 else if (size < 1024*1024)
931 sprintf(sizestr,"%2.2f Kb",(float)size/1024);
932 else
933 sprintf(sizestr,"%2.2f Mb",(float)size/(1024*1024));
934
935 sprintf(Service_content_str,
936 "<FONT FACE=\"consolas\">Service %s (%s) Contents :<br /> <br />", Curr_service_name,
937 Curr_service_format);
938 dic_get_timestamp(0, &secs, &mili);
939 quality = dic_get_quality(0);
940 tsecs = secs;
941 servicep->timestamp = tsecs;
942 my_ctime(&tsecs, timestr, 128);
943 ptr = strrchr(timestr,' ');
944 strcpy(aux, ptr);
945 sprintf(ptr,".%03d",mili);
946 strcat(timestr, aux);
947 timestr[(int)strlen(timestr)-1] = '\0';
948
949 sprintf(str," Timestamp: %s&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp Quality: %d&nbsp&nbsp&nbsp Size: %s<br /><br />",
950 timestr, quality, sizestr);
951
952 strcat(Service_content_str,str);
953 ptr = Curr_service_format;
954 buffer_ptr = buff;
955 while(*ptr)
956 {
957 type = *ptr++;
958 if(*ptr == ':')
959 {
960 ptr++;
961 sscanf(ptr, "%d", &num);
962 ret = did_write_string(type, num, &buffer_ptr, size);
963 size -= ret;
964 if( (ptr = strchr(ptr,';')) )
965 ptr++;
966 else
967 break;
968 }
969 else
970 {
971 ret = did_write_string(type, 0, &buffer_ptr, size);
972 size -= ret;
973 break;
974 }
975 }
976 strcat(Service_content_str,"</FONT>");
977}
978
979
980int did_write_string(char type, int num, void **buffer_ptr, int ssize)
981{
982void *ptr;
983int size, psize;
984
985 void print_service_standard();
986 void print_service_char();
987 void print_service_short();
988 void print_service_float();
989 void print_service_double();
990
991 ptr = *buffer_ptr;
992 switch(type)
993 {
994 case 'L':
995 case 'l':
996 strcat(Service_content_str," L");
997 if(!num)
998 size = ssize/(int)sizeof(int);
999 else
1000 size = num;
1001 psize = size * (int)sizeof(int);
1002 print_service_standard(ptr, size);
1003 break;
1004 case 'I':
1005 case 'i':
1006 strcat(Service_content_str," I");
1007 if(!num)
1008 size = ssize/(int)sizeof(int);
1009 else
1010 size = num;
1011 psize = size * (int)sizeof(int);
1012 print_service_standard(ptr, size);
1013 break;
1014 case 'S':
1015 case 's':
1016 strcat(Service_content_str," S");
1017 if(!num)
1018 size = ssize/(int)sizeof(short);
1019 else
1020 size = num;
1021 psize = size * (int)sizeof(short);
1022 print_service_short(ptr, size);
1023 break;
1024 case 'F':
1025 case 'f':
1026 strcat(Service_content_str," F");
1027 if(!num)
1028 size = ssize/(int)sizeof(float);
1029 else
1030 size = num;
1031 psize = size * (int)sizeof(float);
1032 print_service_float(ptr, size);
1033 break;
1034 case 'D':
1035 case 'd':
1036 strcat(Service_content_str," D");
1037 if(!num)
1038 size = ssize/(int)sizeof(double);
1039 else
1040 size = num;
1041 psize = size * (int)sizeof(double);
1042 print_service_double(ptr, size);
1043 break;
1044 case 'X':
1045 case 'x':
1046 strcat(Service_content_str," X");
1047 if(!num)
1048 size = ssize/(int)sizeof(longlong);
1049 else
1050 size = num;
1051 psize = size * (int)sizeof(longlong);
1052 print_service_standard(ptr, size*2);
1053 break;
1054 case 'C':
1055 case 'c':
1056 default:
1057 strcat(Service_content_str," C");
1058 if(!num)
1059 size = ssize;
1060 else
1061 size = num;
1062 psize = size;
1063 print_service_char(ptr, size);
1064 }
1065 ptr = (char *)ptr + psize;
1066 *buffer_ptr = ptr;
1067 return psize;
1068}
1069
1070void sprintf_html(char *str, int n, int value)
1071{
1072 char tmp[80];
1073 int min, i;
1074
1075 str[0] = '\0';
1076 min = sprintf(tmp,"%d",value);
1077 for(i = 0; i < (n-min); i++)
1078 {
1079 strcat(str,"&nbsp");
1080 }
1081 strcat(str, tmp);
1082}
1083
1084void print_service_standard(int *buff, int size)
1085{
1086int i,j;
1087char *ptr, str[80], tmp[256];
1088int last[4];
1089
1090 ptr = Service_content_str;
1091 ptr += (int)strlen(Service_content_str);
1092 for( i = 0; i < size; i++)
1093 {
1094 strcpy(tmp,"");
1095 if(i%4 == 0)
1096 {
1097 if(i != 0)
1098 {
1099 strcat(tmp,"&nbsp");
1100 }
1101 sprintf_html(str, 7, i);
1102 strcat(tmp,str);
1103 }
1104 if(!(i%4))
1105 strcat(tmp,"H: ");
1106 sprintf(str,"&nbsp&nbsp&nbsp %08X",buff[i]);
1107 strcat(tmp,str);
1108 last[i%4] = buff[i];
1109 if((i%4 == 3) || (i == (size-1)))
1110 {
1111 strcat(tmp,"<br />");
1112 for(j = 0; j <= (i%4); j++)
1113 {
1114 if(j == 0)
1115 strcat(tmp,"&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp D: ");
1116 sprintf_html(str, 12, last[j]);
1117 strcat(tmp,str);
1118 }
1119 strcat(tmp,"<br />");
1120 }
1121 strcpy(ptr, tmp);
1122 ptr += (int)strlen(tmp);
1123 }
1124 strcpy(tmp,"<br />");
1125 strcpy(ptr, tmp);
1126}
1127
1128void print_service_longlong(longlong *buff, int size)
1129{
1130int i,j;
1131char *ptr, str[80], tmp[256];
1132longlong last[4];
1133
1134 ptr = Service_content_str;
1135 ptr += (int)strlen(Service_content_str);
1136 for( i = 0; i < size; i++)
1137 {
1138 strcpy(tmp,"");
1139 if(i%4 == 0)
1140 {
1141 if(i != 0)
1142 {
1143 strcat(tmp,"&nbsp");
1144 }
1145 sprintf_html(str, 7, i);
1146 strcat(tmp,str);
1147 }
1148 if(!(i%4))
1149 strcat(tmp,"H: ");
1150 sprintf(str,"&nbsp&nbsp&nbsp %08X",(unsigned)buff[i]);
1151 strcat(tmp,str);
1152 last[i%4] = buff[i];
1153 if((i%4 == 3) || (i == (size-1)))
1154 {
1155 strcat(tmp,"<br />");
1156 for(j = 0; j <= (i%4); j++)
1157 {
1158 if(j == 0)
1159 strcat(tmp,"&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp D: ");
1160 sprintf_html(str, 12, (int)last[j]);
1161 strcat(tmp,str);
1162 }
1163 strcat(tmp,"<br />");
1164 }
1165 strcpy(ptr, tmp);
1166 ptr += (int)strlen(tmp);
1167 }
1168 strcpy(tmp,"<br />");
1169 strcpy(ptr, tmp);
1170}
1171
1172void print_service_short(short *buff, int size)
1173{
1174int i,j;
1175char *ptr, str[80], tmp[256];
1176short last[8];
1177
1178 ptr = Service_content_str;
1179 ptr += (int)strlen(Service_content_str);
1180 for( i = 0; i < size; i++)
1181 {
1182 strcpy(tmp,"");
1183 if(i%8 == 0)
1184 {
1185 if(i != 0)
1186 {
1187 strcat(tmp,"&nbsp");
1188 }
1189 sprintf_html(str, 7, i);
1190 strcat(tmp,str);
1191 }
1192 if(!(i%8))
1193 strcat(tmp,"H: ");
1194 sprintf(str,"&nbsp %04X",buff[i]);
1195 strcat(tmp,str);
1196 last[i%8] = buff[i];
1197 if((i%8 == 7) || (i == (size-1)))
1198 {
1199 strcat(tmp,"<br />");
1200 for(j = 0; j <= (i%8); j++)
1201 {
1202 if(j == 0)
1203 strcat(tmp,"&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp D: ");
1204 sprintf_html(str, 6, last[j]);
1205 strcat(tmp,str);
1206 }
1207 strcat(tmp,"<br />");
1208 }
1209 strcpy(ptr, tmp);
1210 ptr += (int)strlen(tmp);
1211 }
1212 strcpy(tmp,"<br />");
1213 strcpy(ptr, tmp);
1214}
1215
1216void print_service_char(char *buff, int size)
1217{
1218int i,j;
1219char *asc, *ptr, str[80], tmp[256];
1220
1221 asc = (char *)buff;
1222 ptr = Service_content_str;
1223 ptr += (int)strlen(Service_content_str);
1224 for( i = 0; i < size; i++)
1225 {
1226 strcpy(tmp,"");
1227 if(i%16 == 0)
1228 {
1229 if(i != 0)
1230 {
1231 strcat(tmp,"&nbsp");
1232 }
1233 sprintf_html(str, 7, i);
1234 strcat(tmp,str);
1235 }
1236 if(!(i%16))
1237 strcat(tmp,"H: ");
1238 sprintf(str,"%02X",buff[i]);
1239/* strcat(tmp,str);
1240*/
1241 strcat(tmp," ");
1242 strcat(tmp,&str[(int)strlen(str)-2]);
1243 /*
1244 if(i%4 == 3)
1245 strcat(tmp," ");
1246 */
1247 if((i%16 == 15) || (i == (size-1)))
1248 {
1249 if(i%16 != 15)
1250 {
1251 for(j = 1; j < 16 - (i%16); j++)
1252 strcat(tmp,"&nbsp&nbsp ");
1253 }
1254 strcat(tmp,"&nbsp&nbsp&nbsp '");
1255 for(j = 0; j <= (i%16) ; j++)
1256 {
1257 if(isprint(asc[j]))
1258 {
1259 if(asc[j] == ' ')
1260 sprintf(str,"&nbsp");
1261 else if(asc[j] == '<')
1262 sprintf(str,"&lt");
1263 else if(asc[j] == '>')
1264 sprintf(str,"&gt");
1265 else if(asc[j] == '&')
1266 sprintf(str,"&amp");
1267 else
1268 sprintf(str,"%c",asc[j]);
1269 strcat(tmp,str);
1270 }
1271 else
1272 {
1273 sprintf(str,".");
1274 strcat(tmp,str);
1275 }
1276 }
1277 strcat(tmp,"'<br />");
1278 asc = (char *)&buff[i+1];
1279 }
1280 strcpy(ptr, tmp);
1281 ptr += (int)strlen(tmp);
1282 }
1283 strcpy(tmp,"<br />");
1284 strcpy(ptr, tmp);
1285}
1286
1287void print_service_float(float *buff, int size)
1288{
1289int i;
1290char *ptr, str[80], tmp[256];
1291
1292 ptr = Service_content_str;
1293 ptr += (int)strlen(Service_content_str);
1294 for( i = 0; i < size; i++)
1295 {
1296 strcpy(tmp,"");
1297 if(i%4 == 0)
1298 {
1299 if(i != 0)
1300 {
1301 strcat(tmp,"&nbsp");
1302 }
1303 sprintf_html(str, 7, i);
1304 strcat(tmp,str);
1305 }
1306 sprintf(str,"%12.3G",*(buff++));
1307 strcat(tmp,str);
1308 if((i%4 == 3) || (i == size-1))
1309 {
1310 strcat(tmp,"<br />");
1311 }
1312 strcpy(ptr, tmp);
1313 ptr += (int)strlen(tmp);
1314 }
1315 strcpy(tmp,"<br />");
1316 strcpy(ptr, tmp);
1317 ptr += (int)strlen(tmp);
1318}
1319
1320void print_service_double(double *buff, int size)
1321{
1322int i;
1323char *ptr, str[80], tmp[256];
1324
1325 ptr = Service_content_str;
1326 ptr += (int)strlen(Service_content_str);
1327 for( i = 0; i < size; i++)
1328 {
1329 strcpy(tmp,"");
1330 if(i%4 == 0)
1331 {
1332 if(i != 0)
1333 {
1334 strcat(tmp,"&nbsp");
1335 }
1336 sprintf_html(str, 7, i);
1337 strcat(tmp,str);
1338 }
1339 sprintf(str,"%12.3G",*(buff++));
1340 strcat(tmp,str);
1341 if((i%4 == 3) || (i == size-1))
1342 {
1343 strcat(tmp,"<br />");
1344 }
1345 strcpy(ptr, tmp);
1346 ptr += (int)strlen(tmp);
1347 }
1348 strcpy(tmp,"<br />");
1349 strcpy(ptr, tmp);
1350 ptr += (int)strlen(tmp);
1351}
1352
1353char *addJSONStart(char *ptr)
1354{
1355 char *ptro;
1356
1357 strcat(ptr,"{\n");
1358 ptro = ptr + (int)strlen(ptr);
1359 return ptro;
1360}
1361
1362char *addJSONEnd(char *ptr)
1363{
1364 char *ptro;
1365
1366 strcat(ptr,"}\n");
1367 ptro = ptr + (int)strlen(ptr);
1368 return ptro;
1369}
1370
1371char *addJSONNodeStart(char *ptr, char *node)
1372{
1373 char *ptro;
1374
1375 sprintf(ptr,"%s: [\n", node);
1376 ptro = ptr + (int)strlen(ptr);
1377 return ptro;
1378}
1379
1380char *addJSONNodeEnd(char *ptr)
1381{
1382 char *ptro;
1383
1384 strcat(ptr,"]\n");
1385 ptro = ptr + (int)strlen(ptr);
1386 return ptro;
1387}
1388
1389char *addJSONChildStart(char *ptr, char *child, int sep)
1390{
1391 char *ptro;
1392
1393 if(sep)
1394 sprintf(ptr,"{ %s, ", child);
1395 else
1396 sprintf(ptr,"{ %s", child);
1397 ptro = ptr + (int)strlen(ptr);
1398 return ptro;
1399}
1400
1401char *addJSONChildEnd(char *ptr, int sep)
1402{
1403 char *ptro;
1404
1405 if(sep)
1406 strcat(ptr," },\n");
1407 else
1408 strcat(ptr," }\n");
1409 ptro = ptr + (int)strlen(ptr);
1410 return ptro;
1411}
1412
1413char *getJSONBuffer(char *node, int browser)
1414{
1415 BROWSER *browserp;
1416 int prepareJSONTree();
1417
1418 if(browser)
1419 {
1420 if((browserp = find_browser(browser)))
1421 {
1422 if(browserp->pattern[0] != '\0')
1423 {
1424 prepareJSONTree(node, browserp);
1425 return(browserp->JSONBuffer);
1426 }
1427 browserp->n_services = 0;
1428 browserp->n_servers = 0;
1429 browserp->n_nodes = 0;
1430 }
1431 }
1432 prepareJSONTree(node, 0);
1433 return(JSONBuffer);
1434}
1435
1436char *getJSONSmiBuffer(char *node, int browser)
1437{
1438 BROWSER *browserp;
1439 int prepareJSONSmiTree();
1440
1441 if(!(browserp = find_browser(browser)))
1442 {
1443 browserp = create_browser(browser);
1444 browserp->isSMI = 1;
1445 strcpy(browserp->pattern,"SMI/");
1446 }
1447 if(browser)
1448 {
1449 if((browserp = find_browser(browser)))
1450 {
1451 if(browserp->pattern[0] != '\0')
1452 {
1453 prepareJSONSmiTree(node, browserp);
1454 return(browserp->JSONSmiBuffer);
1455 }
1456// browserp->n_services = 0;
1457// browserp->n_servers = 0;
1458// browserp->n_nodes = 0;
1459 }
1460 }
1461 prepareJSONSmiTree(node, 0);
1462 return(JSONSmiBuffer);
1463}
1464
1465char *getJSONHeader(int isSMI)
1466{
1467 int prepareJSONHeader();
1468
1469 if(isSMI){}
1470 if(JSONHeader[0] == '\0')
1471 prepareJSONHeader();
1472 return(JSONHeader);
1473}
1474
1475int getNodeLabel(char *name, char *label)
1476{
1477 int i;
1478 extern int web_get_node_name();
1479
1480 web_get_node_name(name, label);
1481 for(i = 0; i < ((int)strlen(label) + 1); i++)
1482 {
1483 label[i] = (char)tolower((int)label[i]);
1484 if(label[i] == '.')
1485 {
1486 label[i] = '\0';
1487 break;
1488 }
1489 }
1490 return 1;
1491}
1492
1493int prepareJSONTree(char *node, BROWSER *browserp)
1494{
1495 char *ptr;
1496 NODE *nodep;
1497 SERVER *servp;
1498 char str[256], aux[128];
1499 int selective = 0;
1500 int n_nodes, tot_n_nodes;
1501 int n_servers, tot_n_servers;
1502 int ret, n_found = 0;
1503
1504 if(browserp)
1505 {
1506 if(browserp->pattern[0] != '\0')
1507 selective = 1;
1508 else
1509 return(0);
1510 }
1511 if(!selective)
1512 {
1513 if(JSONBufferSize == 0)
1514 {
1515 JSONBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
1516 }
1517 else if (JSONBufferSize < N_nodes*128+N_servers*128)
1518 {
1519 free(JSONBuffer);
1520 JSONBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
1521 }
1522 ptr = JSONBuffer;
1523 }
1524 else
1525 {
1526 if(browserp->JSONBufferSize == 0)
1527 {
1528 browserp->JSONBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
1529 }
1530 else if (browserp->JSONBufferSize < N_nodes*128+N_servers*128)
1531 {
1532 free(browserp->JSONBuffer);
1533 browserp->JSONBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
1534 }
1535 ptr = browserp->JSONBuffer;
1536 }
1537 *ptr = '\0';
1538 if(!strcmp(node, "src"))
1539 {
1540 ptr = addJSONStart(ptr);
1541 ptr = addJSONNodeStart(ptr,"children");
1542 sprintf(str,"text: \"%s\", id: \"Nodes\", expanded: false", Title);
1543 ptr = addJSONChildStart(ptr,str,1);
1544 ptr = addJSONNodeStart(ptr,"children");
1545 nodep = Node_head;
1546 tot_n_nodes = 0;
1547 while( (nodep = (NODE *)sll_get_next((SLL *)nodep)) )
1548 {
1549 nodep->match = 1;
1550 if(selective)
1551 {
1552 if(!(ret = find_service_pattern(nodep, 0, browserp->pattern, &tot_n_servers)))
1553 {
1554 nodep->match = 0;
1555 continue;
1556 }
1557 else
1558 {
1559 n_found += ret;
1560 }
1561 }
1562 tot_n_nodes++;
1563 }
1564 n_nodes = 0;
1565 nodep = Node_head;
1566 while( (nodep = (NODE *)sll_get_next((SLL *)nodep)) )
1567 {
1568 if(!nodep->match)
1569 continue;
1570 getNodeLabel(nodep->name, aux);
1571 sprintf(str,"text: \"%s\", id: \"%s\", qtip: \"%s\"",
1572 aux, nodep->name, nodep->name);
1573 ptr = addJSONChildStart(ptr,str,0);
1574 n_nodes++;
1575if(WebDID_Debug)
1576 printf("adding %s %d %d\n",nodep->name, n_nodes, tot_n_nodes);
1577 if(n_nodes < tot_n_nodes)
1578 ptr = addJSONChildEnd(ptr,1);
1579 else
1580 ptr = addJSONChildEnd(ptr,0);
1581 }
1582 ptr = addJSONNodeEnd(ptr);
1583 ptr = addJSONChildEnd(ptr,0);
1584 ptr = addJSONNodeEnd(ptr);
1585 ptr = addJSONEnd(ptr);
1586 if(selective)
1587 {
1588 browserp->n_services = n_found;
1589 browserp->n_servers = tot_n_servers;
1590 browserp->n_nodes = tot_n_nodes;
1591 }
1592 }
1593 else
1594 {
1595 if((nodep = find_node(node)))
1596 {
1597 ptr = addJSONStart(ptr);
1598 ptr = addJSONNodeStart(ptr,"children");
1599 servp = nodep->server_head;
1600 tot_n_servers = 0;
1601 while( (servp = (SERVER *)sll_get_next((SLL *)servp)) )
1602 {
1603 servp->match = 1;
1604 if(servp->busy != 1)
1605 {
1606 servp->match = 0;
1607 continue;
1608 }
1609 if(selective)
1610 {
1611 if(!(ret = find_service_pattern(nodep, servp, browserp->pattern, 0)))
1612 {
1613 servp->match = 0;
1614 continue;
1615 }
1616 else
1617 {
1618 n_found += ret;
1619 }
1620 }
1621 tot_n_servers++;
1622 }
1623 n_servers = 0;
1624 servp = nodep->server_head;
1625 while( (servp = (SERVER *)sll_get_next((SLL *)servp)) )
1626 {
1627 if(!servp->match)
1628 continue;
1629 sprintf(str,"text: \"%s\", id: \"%d\", leaf: true, icon: \"server.png\"",servp->name, servp->server.pid);
1630 ptr = addJSONChildStart(ptr,str,0);
1631 n_servers++;
1632 if(n_servers < tot_n_servers)
1633 ptr = addJSONChildEnd(ptr,1);
1634 else
1635 ptr = addJSONChildEnd(ptr,0);
1636 }
1637 ptr = addJSONNodeEnd(ptr);
1638 ptr = addJSONEnd(ptr);
1639 }
1640 }
1641 /*
1642if(!selective)
1643printf(" Nodes&Servers %s\n",JSONBuffer);
1644else
1645printf(" Nodes&Servers %s\n",browserp->JSONBuffer);
1646 */
1647 return(1);
1648}
1649
1650int prepareJSONSmiTree(char *node, BROWSER *browserp)
1651{
1652 char *ptr;
1653 NODE *nodep;
1654 SERVER *servp;
1655 char str[256], aux[128];
1656 int selective = 0;
1657 int n_nodes, tot_n_nodes;
1658 int n_servers, tot_n_servers;
1659 int ret, n_found = 0;
1660 char pattern[256] = {'\0'};
1661 char *sptr;
1662
1663 if(browserp)
1664 {
1665 if(browserp->pattern[0] != '\0')
1666 {
1667 selective = 1;
1668 strcpy(pattern, browserp->pattern);
1669 }
1670// else
1671// return(0);
1672 }
1673// selective = 1;
1674// strcpy(pattern,"SMI/*");
1675 if(!selective)
1676 {
1677 if(JSONSmiBufferSize == 0)
1678 {
1679 JSONSmiBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
1680 }
1681 else if (JSONSmiBufferSize < N_nodes*128+N_servers*128)
1682 {
1683 free(JSONSmiBuffer);
1684 JSONSmiBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
1685 }
1686 ptr = JSONSmiBuffer;
1687 }
1688 else
1689 {
1690 if(browserp->JSONSmiBufferSize == 0)
1691 {
1692 browserp->JSONSmiBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
1693 }
1694 else if (browserp->JSONSmiBufferSize < N_nodes*128+N_servers*128)
1695 {
1696 free(browserp->JSONSmiBuffer);
1697 browserp->JSONSmiBuffer = malloc((size_t)(N_nodes*128+N_servers*128));
1698 }
1699 ptr = browserp->JSONSmiBuffer;
1700 }
1701 *ptr = '\0';
1702 if(!strcmp(node, "src"))
1703 {
1704 ptr = addJSONStart(ptr);
1705 ptr = addJSONNodeStart(ptr,"children");
1706 sprintf(str,"text: \"%s\", id: \"Nodes\", expanded: false", Title);
1707 ptr = addJSONChildStart(ptr,str,1);
1708 ptr = addJSONNodeStart(ptr,"children");
1709 nodep = Node_head;
1710 tot_n_nodes = 0;
1711 while( (nodep = (NODE *)sll_get_next((SLL *)nodep)) )
1712 {
1713 nodep->match = 1;
1714 if(selective)
1715 {
1716 if(!(ret = find_service_pattern(nodep, 0, pattern, &tot_n_servers)))
1717 {
1718 nodep->match = 0;
1719 continue;
1720 }
1721 else
1722 {
1723 n_found += ret;
1724 }
1725 }
1726 tot_n_nodes++;
1727 }
1728 n_nodes = 0;
1729 nodep = Node_head;
1730 while( (nodep = (NODE *)sll_get_next((SLL *)nodep)) )
1731 {
1732 if(!nodep->match)
1733 continue;
1734 getNodeLabel(nodep->name, aux);
1735 sprintf(str,"text: \"%s\", id: \"%s\", qtip: \"%s\"",
1736 aux, nodep->name, nodep->name);
1737 ptr = addJSONChildStart(ptr,str,0);
1738 n_nodes++;
1739if(WebDID_Debug)
1740 printf("adding %s %d %d\n",nodep->name, n_nodes, tot_n_nodes);
1741 if(n_nodes < tot_n_nodes)
1742 ptr = addJSONChildEnd(ptr,1);
1743 else
1744 ptr = addJSONChildEnd(ptr,0);
1745 }
1746 ptr = addJSONNodeEnd(ptr);
1747 ptr = addJSONChildEnd(ptr,0);
1748 ptr = addJSONNodeEnd(ptr);
1749 ptr = addJSONEnd(ptr);
1750 if(selective)
1751 {
1752 browserp->n_services = n_found;
1753 browserp->n_servers = tot_n_servers;
1754 browserp->n_nodes = tot_n_nodes;
1755 }
1756 }
1757 else
1758 {
1759 if((nodep = find_node(node)))
1760 {
1761 ptr = addJSONStart(ptr);
1762 ptr = addJSONNodeStart(ptr,"children");
1763 servp = nodep->server_head;
1764 tot_n_servers = 0;
1765 while( (servp = (SERVER *)sll_get_next((SLL *)servp)) )
1766 {
1767 servp->match = 1;
1768 if(servp->busy != 1)
1769 {
1770 servp->match = 0;
1771 continue;
1772 }
1773 if(selective)
1774 {
1775 if(!(ret = find_service_pattern(nodep, servp, pattern, 0)))
1776 {
1777 servp->match = 0;
1778 continue;
1779 }
1780 else
1781 {
1782 n_found += ret;
1783 }
1784 }
1785 tot_n_servers++;
1786 }
1787 n_servers = 0;
1788 servp = nodep->server_head;
1789 while( (servp = (SERVER *)sll_get_next((SLL *)servp)) )
1790 {
1791 if(!servp->match)
1792 continue;
1793 strcpy(aux, servp->name);
1794 sptr = strstr(aux,"_SMI");
1795 if(sptr)
1796 *sptr = '\0';
1797 sprintf(str,"text: \"%s\", id: \"%d\", leaf: true, icon: \"server.png\", name: \"%s\"",aux, servp->server.pid, servp->name);
1798 ptr = addJSONChildStart(ptr,str,0);
1799 n_servers++;
1800 if(n_servers < tot_n_servers)
1801 ptr = addJSONChildEnd(ptr,1);
1802 else
1803 ptr = addJSONChildEnd(ptr,0);
1804 }
1805 ptr = addJSONNodeEnd(ptr);
1806 ptr = addJSONEnd(ptr);
1807 }
1808 }
1809 /*
1810if(!selective)
1811printf(" Nodes&Servers %s\n",JSONBuffer);
1812else
1813printf(" Nodes&Servers %s\n",browserp->JSONBuffer);
1814 */
1815printf("%s\n",browserp->JSONSmiBuffer);
1816 return(1);
1817}
1818
1819int prepareJSONHeader()
1820{
1821 char *ptr;
1822 char str[128];
1823
1824 ptr = JSONHeader;
1825 *ptr = '\0';
1826 ptr = addJSONStart(ptr);
1827 ptr = addJSONNodeStart(ptr,"items");
1828 sprintf(str,"text: \"%s\"",Title);
1829 ptr = addJSONChildStart(ptr,str,0);
1830 ptr = addJSONChildEnd(ptr,1);
1831 sprintf(str,"text: \"%d Servers Known - %d Services Available\"",N_servers, N_services);
1832 ptr = addJSONChildStart(ptr,str,0);
1833 ptr = addJSONChildEnd(ptr,0);
1834 ptr = addJSONNodeEnd(ptr);
1835 ptr = addJSONEnd(ptr);
1836if(WebDID_Debug)
1837printf(" Header %s\n",JSONHeader);
1838 return(1);
1839}
1840
1841char *JSONServices = 0;
1842int JSONServicesSize = 0;
1843char *prepareJSONServiceList(SERVER *servp, char *node, int pid, BROWSER *browserp)
1844{
1845 DNS_SERVICE_INFO *servicep;
1846 char *ptr;
1847 int n_services, i;
1848 char str[256], type_str[256];
1849 int selective = 0;
1850 int n_found = 0, n;
1851
1852 servicep = servp->service_ptr;
1853 n_services = servp->server.n_services;
1854 if(JSONServicesSize == 0)
1855 {
1856 JSONServicesSize = n_services*256;
1857 JSONServices = malloc((size_t)JSONServicesSize);
1858 }
1859 else if (JSONServicesSize < n_services*256)
1860 {
1861 free(JSONServices);
1862 JSONServicesSize = n_services*256;
1863 JSONServices = malloc((size_t)JSONServicesSize);
1864 }
1865 if(browserp)
1866 {
1867 if(browserp->pattern[0] != '\0')
1868 selective = 1;
1869 }
1870 n_found = n_services;
1871 if(selective)
1872 {
1873 n_found = find_server_service_pattern(servp, browserp->pattern);
1874 }
1875 ptr = JSONServices;
1876 *ptr = '\0';
1877 ptr = addJSONStart(ptr);
1878 ptr = addJSONNodeStart(ptr,"children");
1879 if(selective)
1880 sprintf(str,"text: \"%s (%d/%d services, pid %d)\"",servp->name, n_found, n_services, servp->server.pid);
1881 else
1882 sprintf(str,"text: \"%s (%d services, pid %d)\"",servp->name, n_services, servp->server.pid);
1883 ptr = addJSONChildStart(ptr,str,1);
1884 ptr = addJSONNodeStart(ptr,"children");
1885 servicep = servp->service_ptr;
1886 n = 0;
1887 for(i = 0; i < n_services; i++)
1888 {
1889/*
1890printf("Service type = %d\n",servicep->type);
1891*/
1892 if((!selective) || (strstr(servicep->name, browserp->pattern)))
1893 {
1894 if(servicep->type == 1)
1895 {
1896 sprintf(type_str,"%d@%s|%s|CMD", pid, node, servicep->name);
1897 sprintf(str,"text: \"%s\", id: \"%s\", leaf: true, icon: \"leaf_cmd.gif\"",servicep->name, type_str);
1898 }
1899 else
1900 {
1901 sprintf(type_str,"%d@%s|%s", pid, node, servicep->name);
1902 sprintf(str,"text: \"%s\", id: \"%s\", leaf: true",servicep->name, type_str);
1903 }
1904 ptr = addJSONChildStart(ptr,str,0);
1905 n++;
1906 if(n < n_found)
1907 ptr = addJSONChildEnd(ptr,1);
1908 else
1909 ptr = addJSONChildEnd(ptr,0);
1910 }
1911 servicep++;
1912 }
1913 ptr = addJSONNodeEnd(ptr);
1914 ptr = addJSONChildEnd(ptr,0);
1915 ptr = addJSONNodeEnd(ptr);
1916 ptr = addJSONEnd(ptr);
1917 return JSONServices;
1918}
1919
1920char *JSONSmiServices = 0;
1921int JSONSmiServicesSize = 0;
1922
1923char *prepareJSONSmiObjectList(SERVER *servp, char *node, int pid, BROWSER *browserp)
1924{
1925 DNS_SERVICE_INFO *servicep;
1926 char *ptr;
1927 int n_services, i;
1928 char str[512], type_str[512];
1929 int selective = 0;
1930 int n_found = 0, n, mode_index;
1931 char aux[512], *sptr, state[512], *stptr;
1932 OBJSTATE *smidomainp;
1933 int findSmiServices();
1934
1935printf("prepareJSONSmiObjectList name %s\n", servp->name);
1936 servicep = servp->service_ptr;
1937 n_services = servp->server.n_services;
1938 if(JSONSmiServicesSize == 0)
1939 {
1940 JSONSmiServicesSize = n_services*512;
1941 JSONSmiServices = malloc((size_t)JSONSmiServicesSize);
1942 }
1943 else if (JSONSmiServicesSize < n_services*512)
1944 {
1945 free(JSONSmiServices);
1946 JSONSmiServicesSize = n_services*512;
1947 JSONSmiServices = malloc((size_t)JSONSmiServicesSize);
1948 }
1949 if(browserp)
1950 {
1951 if(browserp->pattern[0] != '\0')
1952 selective = 1;
1953 }
1954 n_found = n_services;
1955 /*
1956 if(selective)
1957 {
1958 n_found = find_server_service_pattern(servp, browserp->pattern);
1959 }
1960 */
1961
1962 n_found = findSmiServices(browserp, servp);
1963 smidomainp = browserp->smidomainp;
1964
1965printf("prepareJSONSmiObjectList1 name %s\n", servp->name);
1966
1967
1968 ptr = JSONSmiServices;
1969 *ptr = '\0';
1970 ptr = addJSONStart(ptr);
1971 ptr = addJSONNodeStart(ptr,"children");
1972 /*
1973 if(selective)
1974 sprintf(str,"name: \"%s (%d/%d services, pid %d)\"",servp->name, n_found, n_services, servp->server.pid);
1975 else
1976 sprintf(str,"name: \"%s (%d services, pid %d)\"",servp->name, n_services, servp->server.pid);
1977 */
1978 sprintf(str,"name: \"%s (%d objects, pid %d)\"",servp->name, n_found, servp->server.pid);
1979 ptr = addJSONChildStart(ptr,str,1);
1980 ptr = addJSONNodeStart(ptr,"children");
1981 servicep = servp->service_ptr;
1982 n = 0;
1983 for(i = 0; i < n_services; i++)
1984 {
1985/*
1986printf("Service type = %d\n",servicep->type);
1987*/
1988printf("prepareJSONSmiObjectList2 obj name %s\n", servicep->name);
1989 if((!selective) || (strstr(servicep->name, browserp->pattern)))
1990 {
1991/*
1992 if(servicep->type == 1)
1993 {
1994 sprintf(type_str,"%d@%s|%s|CMD", pid, node, servicep->name);
1995 sprintf(str,"name: \"%s\", id: \"%s\", leaf: true, icon: \"leaf_cmd.gif\"",servicep->name, type_str);
1996 }
1997 else
1998 {
1999 sprintf(type_str,"%d@%s|%s", pid, node, servicep->name);
2000 sprintf(str,"name: \"%s\", state: \"RUNNING\", id: \"%s\", leaf: true",servicep->name, type_str);
2001 }
2002*/
2003 if(servicep->status == 2)
2004 {
2005 sprintf(type_str,"%d@%s|%s", pid, node, servicep->name);
2006 strcpy(aux, servicep->name);
2007 sptr = strchr(aux,'/');
2008 if(sptr)
2009 {
2010 sptr++;
2011 sptr = strchr(sptr,'/');
2012 if(sptr)
2013 sptr++;
2014 }
2015 strcpy(state, smidomainp[i].state);
2016 stptr = strchr(state,'/');
2017 if(stptr)
2018 {
2019 *stptr = '\0';
2020 }
2021 mode_index = smidomainp[i].mode_index;
2022// sprintf(str,"name: \"%s\", state: \"%s\", id: \"%s\", leaf: true, fname: \"%s\"",sptr, state, type_str, servicep->name);
2023 sprintf(str,"name: \"%s\", state: \"%s\", mode: \"%s\",id: \"%s\", leaf: true, fname: \"%s\"",
2024 sptr, state, smidomainp[mode_index].state, type_str, servicep->name);
2025
2026 ptr = addJSONChildStart(ptr,str,0);
2027 n++;
2028 if(n < n_found)
2029 ptr = addJSONChildEnd(ptr,1);
2030 else
2031 ptr = addJSONChildEnd(ptr,0);
2032 }
2033 }
2034 servicep++;
2035 }
2036 ptr = addJSONNodeEnd(ptr);
2037 ptr = addJSONChildEnd(ptr,0);
2038 ptr = addJSONNodeEnd(ptr);
2039 ptr = addJSONEnd(ptr);
2040printf("%s\n",JSONSmiServices);
2041 return JSONSmiServices;
2042}
2043
2044void update_smi_state(OBJSTATE **tag, char *data, int *size)
2045{
2046 OBJSTATE *servicep;
2047 time_t tsecs;
2048
2049 if(*size){}
2050 servicep = *tag;
2051
2052 if(strcmp(servicep->state, data))
2053 {
2054 strcpy(servicep->state, data);
2055 tsecs = time((time_t *)0);
2056 ((BROWSER *)(servicep->browserp))->last_changed = tsecs;
2057 }
2058//printf("SMI State %s %s %08x\n", servicep->name, servicep->state, (unsigned int)servicep);
2059}
2060
2061int findSmiServices(BROWSER *browserp, SERVER *servp)
2062{
2063 DNS_SERVICE_INFO *servicep;
2064 int n_services, i, index;
2065 int n_found = 0, sid;
2066 int checkSmiObjName();
2067 int findSmiModeObj();
2068
2069 n_services = servp->server.n_services;
2070 if(strcmp(browserp->curr_smidomain,servp->name))
2071 {
2072 if(browserp->curr_smidomain[0] != '\0')
2073 {
2074// unsubscribe; free
2075 for(i = 0; i < browserp->curr_smidomain_size; i++)
2076 {
2077 if(browserp->smidomainp[i].sid)
2078 dic_release_service(browserp->smidomainp[i].sid);
2079 }
2080 free(browserp->smidomainp);
2081 browserp->curr_smidomain[0] = '\0';
2082 browserp->curr_smidomain_size = 0;
2083 }
2084 strcpy(browserp->curr_smidomain, servp->name);
2085 browserp->smidomainp = malloc(n_services * sizeof(OBJSTATE));
2086 browserp->curr_smidomain_size = n_services;
2087 }
2088 else
2089 return browserp->curr_smidomain_nobjs;
2090 servicep = servp->service_ptr;
2091 for(i = 0; i < n_services; i++)
2092 {
2093 browserp->smidomainp[i].sid = 0;
2094 browserp->smidomainp[i].state[0] = '\0';
2095 if(checkSmiObjName(servicep))
2096 {
2097 strcpy(browserp->smidomainp[i].name, servicep->name);
2098// strcpy(browserp->smidomainp[i].state, "");
2099 browserp->smidomainp[i].browserp = browserp;
2100//printf("address %s %08x\n",browserp->smidomainp[i].name, (unsigned int)&(browserp->smidomainp[i]));
2101 sid = dic_info_service(servicep->name,MONITORED,0,0,0,update_smi_state, &(browserp->smidomainp[i]),
2102 no_link_str, 5);
2103 browserp->smidomainp[i].sid = sid;
2104 if(servicep->status == 2)
2105 n_found++;
2106 }
2107 servicep++;
2108 }
2109 servicep = servp->service_ptr;
2110 for(i = 0; i < n_services; i++)
2111 {
2112 if(servicep->status == 2)
2113 {
2114 index = findSmiModeObj(servp->service_ptr, n_services, servicep->name);
2115 browserp->smidomainp[i].mode_index = index;
2116 }
2117 servicep++;
2118 }
2119 browserp->curr_smidomain_nobjs = n_found;
2120 return n_found;
2121}
2122
2123int findSmiModeObj(DNS_SERVICE_INFO *serviceptr, int n_services, char *name)
2124{
2125 int i;
2126 DNS_SERVICE_INFO *servicep;
2127 char mode_name[256], *ptr, *ptr1, *ptr2;
2128
2129 servicep = serviceptr;
2130 strcpy(mode_name, name);
2131 ptr1 = mode_name;
2132 if((ptr = strstr(mode_name,"::")))
2133 {
2134 *ptr = '\0';
2135 ptr2 = ptr1;
2136 while((ptr1 = strchr(ptr1,'/')))
2137 {
2138 ptr1++;
2139 ptr2 = ptr1;
2140 }
2141 if(strcmp(ptr2, ptr+2))
2142 *ptr = ':';
2143 }
2144 strcat(mode_name,"_FWM");
2145printf("Find SMI Mode %s %s\n",name, mode_name);
2146 for(i = 0; i < n_services; i++)
2147 {
2148 if(servicep->status == 3)
2149 {
2150 if(!strcmp(servicep->name, mode_name))
2151 {
2152printf("Find SMI Mode index %s %s %d\n",mode_name, servicep->name, i);
2153 return i;
2154 }
2155 }
2156 servicep++;
2157 }
2158 return 0;
2159}
2160
2161int checkSmiObjName(DNS_SERVICE_INFO *servicep)
2162{
2163 int ismode = 0, ret = 0;
2164 char *name;
2165 int matchString();
2166
2167 name = servicep->name;
2168 if(matchString(name,"SMI/*"))
2169 {
2170 ret = 1;
2171 if(matchString(name,"*&ALLOC*"))
2172 ret = 0;
2173 else if(matchString(name,"*/ACTIONS&PARS"))
2174 ret = 0;
2175 else if(matchString(name,"*/BUSY"))
2176 ret = 0;
2177 else if(matchString(name,"*/CMD"))
2178 ret = 0;
2179 else if(matchString(name,"*/OBJECTSET_LIST"))
2180 ret = 0;
2181 else if(matchString(name,"*/OBJECT_LIST"))
2182 ret = 0;
2183 else if(matchString(name,"*/SMI_VERSION_NUMBER"))
2184 ret = 0;
2185 else if(matchString(name,"*/SET/*"))
2186 ret = 0;
2187// If JCOP framework
2188 else if(matchString(name,"*_FWDM"))
2189 ret = 0;
2190 else if(matchString(name,"*_FWCNM"))
2191 ret = 0;
2192 else if(matchString(name,"*_FWM"))
2193 {
2194 ismode = 1;
2195 if(matchString(name,"*::*"))
2196 ret = 0;
2197 }
2198 }
2199 if(ret)
2200 {
2201 if(ismode)
2202 servicep->status = 3;
2203 else
2204 servicep->status = 2;
2205 }
2206 return ret;
2207}
2208
2209int matchString( char *wzString, char *wzPattern )
2210{
2211 switch (*wzPattern){
2212 case '\0':
2213 return !*wzString;
2214 case '*':
2215 return matchString(wzString, wzPattern+1) ||
2216 ( *wzString && matchString(wzString+1, wzPattern) );
2217 case '?':
2218 return *wzString &&
2219 matchString(wzString+1, wzPattern+1);
2220 default:
2221 return (*wzPattern == *wzString) &&
2222 matchString(wzString+1, wzPattern+1);
2223 }
2224}
2225
2226int get_type_size(char type)
2227{
2228 int size;
2229
2230 switch(type)
2231 {
2232 case 'L':
2233 case 'l':
2234 size = sizeof(long);
2235 break;
2236 case 'I':
2237 case 'i':
2238 size = sizeof(int);
2239 break;
2240 case 'S':
2241 case 's':
2242 size = sizeof(short);
2243 break;
2244 case 'F':
2245 case 'f':
2246 size = sizeof(float);
2247 break;
2248 case 'D':
2249 case 'd':
2250 size = sizeof(double);
2251 break;
2252 case 'C':
2253 case 'c':
2254 default:
2255 size = 1;
2256 }
2257 return(size);
2258}
2259
2260void did_prepare_command(char *str, char *service, char *format)
2261{
2262char type;
2263int num;
2264int size, full_size = 0;
2265char *ptr;
2266static int last_size = 0;
2267static void *last_buffer = 0;
2268void *buffer_ptr;
2269char *str_ptr;
2270void did_read_string(char, int, void **, char **);
2271
2272 str_ptr = str;
2273 ptr = format;
2274 while(*ptr)
2275 {
2276 type = *ptr++;
2277 if(*ptr == ':')
2278 {
2279 ptr++;
2280 size = get_type_size(type);
2281 sscanf(ptr, "%d", &num);
2282 full_size += size * num;
2283 if( (ptr = strchr(ptr,';')) )
2284 ptr++;
2285 else
2286 break;
2287 }
2288 }
2289
2290 full_size += 256;
2291 if(full_size > last_size)
2292 {
2293 if(last_size)
2294 free(last_buffer);
2295 last_buffer = malloc((size_t)full_size);
2296 last_size = full_size;
2297 }
2298 memset(last_buffer, 0, (size_t)last_size);
2299 buffer_ptr = last_buffer;
2300 ptr = format;
2301 while(*ptr)
2302 {
2303 type = *ptr++;
2304 if(*ptr == ':')
2305 {
2306 ptr++;
2307 sscanf(ptr, "%d", &num);
2308 did_read_string(type, num, &buffer_ptr, &str_ptr);
2309 if(!str_ptr)
2310 break;
2311 if( (ptr = strchr(ptr,';')) )
2312 ptr++;
2313 else
2314 break;
2315 }
2316 else
2317 {
2318 did_read_string(type, 0, &buffer_ptr, &str_ptr);
2319 break;
2320 }
2321 }
2322 full_size = (int) ((char *)buffer_ptr - (char *)last_buffer);
2323 dic_cmnd_service(service,last_buffer,full_size);
2324}
2325
2326int read_str_int(char *str)
2327{
2328 int i;
2329 if((str[0] == '0') && (str[1] == 'x'))
2330 sscanf(str+2,"%x",&i);
2331 else
2332 sscanf(str,"%d",&i);
2333 return(i);
2334}
2335
2336int read_str_char(char *str, char *cc)
2337{
2338 int num;
2339
2340 if(str[0] == '\'')
2341 *cc = str[1];
2342 else if(str[0] == '\"')
2343 return(0);
2344 else if((str[0] == '0') && (str[1] == 'x'))
2345 {
2346 sscanf(str+2,"%x",&num);
2347 if(num <= 0xff)
2348 *cc = (char)num;
2349 else
2350 return(-1);
2351 }
2352 else if(isalpha(str[0]))
2353 return(-1);
2354 else
2355 {
2356 sscanf(str,"%d",&num);
2357 if(num <= 0xff)
2358 *cc = (char)num;
2359 else
2360 return(-1);
2361 }
2362 return(1);
2363}
2364
2365void did_read_string(char type, int num, void **buffer_ptr, char **str_ptr)
2366{
2367int i, ret = 0;
2368float ff;
2369double dd;
2370void *ptr;
2371char *strp, *ptr1;
2372char cc;
2373 short s;
2374
2375 strp = *str_ptr;
2376 ptr = *buffer_ptr;
2377 if(!num)
2378 num = 1000000;
2379 switch(type)
2380 {
2381 case 'L':
2382 case 'l':
2383 case 'I':
2384 case 'i':
2385 for(i = 0; i<num; i++)
2386 {
2387 *(int *)ptr = read_str_int(strp);
2388 ptr = (int *)ptr +1;
2389 if( (strp = strchr(strp,' ')) )
2390 strp++;
2391 else
2392 break;
2393 }
2394 break;
2395 case 'S':
2396 case 's':
2397 for(i = 0; i<num; i++)
2398 {
2399 s = (short)read_str_int(strp);
2400 *((short *)ptr) = s;
2401 ptr = (short *)ptr +1;
2402 if( (strp = strchr(strp,' ')) )
2403 strp++;
2404 else
2405 break;
2406 }
2407 break;
2408 case 'F':
2409 case 'f':
2410 for(i = 0; i<num; i++)
2411 {
2412 sscanf(strp,"%f",&ff);
2413 *(float *)ptr = ff;
2414 ptr = (float *)ptr +1;
2415 if( (strp = strchr(strp,' ')) )
2416 strp++;
2417 else
2418 break;
2419 }
2420 break;
2421 case 'D':
2422 case 'd':
2423 for(i = 0; i<num; i++)
2424 {
2425 sscanf(strp,"%f",&ff);
2426 dd = (double)ff;
2427 *(double *)ptr = dd;
2428 ptr = (double *)ptr +1;
2429 if( (strp = strchr(strp,' ')) )
2430 strp++;
2431 else
2432 break;
2433 }
2434 break;
2435 case 'C':
2436 case 'c':
2437 default:
2438 for(i = 0; i<num; i++)
2439 {
2440 if((ret = read_str_char(strp, &cc)) <= 0)
2441 break;
2442 *(char *)ptr = cc;
2443 ptr = (char *)ptr +1;
2444 if( (strp = strchr(strp,' ')) )
2445 strp++;
2446 else
2447 break;
2448 }
2449 if(ret <= 0)
2450 {
2451 if(!ret)
2452 {
2453 strp++;
2454 }
2455 num = (int)strlen(strp)+1;
2456 strncpy((char *)ptr,strp,(size_t)num);
2457 if( (ptr1 = (char *)strchr((char *)ptr,'\"')) )
2458 {
2459 num--;
2460 *ptr1 = '\0';
2461 }
2462 ptr = (char *)ptr + num;
2463 if( (strp = strchr(strp,' ')) )
2464 strp++;
2465 else
2466 break;
2467 }
2468 }
2469 *buffer_ptr = ptr;
2470 *str_ptr = strp;
2471}
Note: See TracBrowser for help on using the repository browser.