FACT++  1.0
webDid.c
Go to the documentation of this file.
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 
8 extern int WebDID_Debug;
9 
10 typedef struct item{
11  struct item *next;
14  char name[MAX_NAME];
15  int match;
16  int busy;
17  int isSMI;
18 }SERVER;
19 
20 typedef struct nitem{
21  struct nitem *next;
23  char name[MAX_NAME];
24  int match;
25  int busy;
26  int hasSMI;
27 }NODE;
29 
30 typedef struct sitem{
31  struct sitem *next;
32  char name[MAX_NAME];
33  int sid;
34  void *buffer;
36  int size;
37  time_t timestamp;
38  void *buffer_str;
40  int str_size;
41  int conn_id;
43  time_t last_updated;
47 
48 typedef struct objstate{
49  char name[MAX_NAME];
50  char state[512];
51  int sid;
53  void *browserp;
54 }OBJSTATE;
55 /*
56 typedef struct domainitem{
57  char name[MAX_NAME];
58  OBJSTATE objs[1];
59 }CURR_SMIDOMAIN;
60 */
61 typedef struct bitem{
62  struct bitem *next;
63  int id;
64  int subscribe;
66  time_t last_updated;
67  time_t last_polled;
68  time_t last_changed;
69  int conn_id;
71  int n_servers;
72  int n_nodes;
74  char *JSONBuffer;
78  char pattern[256];
81  int isSMI;
82  int n_domains;
87 }BROWSER;
89 
90 char *JSONBuffer = 0;
92 char JSONHeader[256] = {'\0'};
93 char JSONSmiHeader[256] = {'\0'};
94 
95 char *JSONSmiBuffer = 0;
97 
98 int First_time = 1;
99 int Curr_view_opt = -1;
104 int N_nodes = 0;
105 int N_servers = 0;
106 int N_services = 0;
107 static char no_link = -1;
108 static char no_link_str[5] = "DEAD";
109 int no_link_int = -1;
110 FILE *fptr;
111 
118 
120 char Title[128];
121 
122 int 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();
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);
150 printf("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 
157 SERVER *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 
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 
190 {
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 
208 int 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 
239 {
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 
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 /*
268 void 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 */
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 /*
297 void 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 */
304 void update_servers(int *tag, DNS_DID *buffer, int *size)
305 {
306 int n_services, service_size;
307 SERVER *servp;
308 NODE *nodep;
309 int j;
310 char str[MAX_NAME], sname[MAX_NAME], *ptr;
311 int prepareJSONTree();
312 int 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);
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])
434 }
435 
436 void 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 
448 char *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();
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 
475 void 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 
487 char *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();
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 
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 
569 void 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 
613 {
614 
615 if(WebDID_Debug)
616 printf("\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 
627 int delete_browser(BROWSER *browserp)
628 {
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 
645 {
646  BROWSER *browserp;
647  time_t tsecs;
648 
649  browserp = (BROWSER *)tag;
650 if(WebDID_Debug)
651 printf("\nCheck_browser %d\n",browserp->id);
652  tsecs = time((time_t *)0);
653  if((tsecs - browserp->last_polled) > 20)
654  {
655 if(WebDID_Debug)
656 printf("\nDeleting browser %d\n\n",browserp->id);
657  delete_browser(browserp);
658  }
659  else
660  dtq_start_timer(10, check_browser, browserp);
661 }
662 
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 
696 int 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);
705 if(WebDID_Debug)
706 printf("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 
718 int update_service_data(char *service, int conn_id, int subscribe, int req, int browser, int force)
719 {
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 
789 int check_browser_changes(char *service, int conn_id, int subscribe, int req, int browser, int force)
790 {
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 
842 int 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 
870 void recv_service_info(void **tag, int *buffer, int *size)
871 {
872  int conn_id;
874  extern void sendData();
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);
899  if((*size == 4 ) && (*buffer == -1))
900  {
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 
917 {
918 char type;
919 int num, ret;
920 char str[256];
921 char *ptr;
922 void *buffer_ptr;
923 char timestr[256], aux[64], sizestr[64];
924 int quality = 0, secs = 0, mili = 0;
925 int did_write_string(char, int, void **, int);
926 time_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 
936  "<FONT FACE=\"consolas\">Service %s (%s) Contents :<br /> <br />", Curr_service_name,
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 
980 int did_write_string(char type, int num, void **buffer_ptr, int ssize)
981 {
982 void *ptr;
983 int 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 
1070 void 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 
1085 {
1086 int i,j;
1087 char *ptr, str[80], tmp[256];
1088 int 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 
1129 {
1130 int i,j;
1131 char *ptr, str[80], tmp[256];
1132 longlong 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 
1172 void print_service_short(short *buff, int size)
1173 {
1174 int i,j;
1175 char *ptr, str[80], tmp[256];
1176 short 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 
1216 void print_service_char(char *buff, int size)
1217 {
1218 int i,j;
1219 char *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 
1287 void print_service_float(float *buff, int size)
1288 {
1289 int i;
1290 char *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 
1320 void print_service_double(double *buff, int size)
1321 {
1322 int i;
1323 char *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 
1353 char *addJSONStart(char *ptr)
1354 {
1355  char *ptro;
1356 
1357  strcat(ptr,"{\n");
1358  ptro = ptr + (int)strlen(ptr);
1359  return ptro;
1360 }
1361 
1362 char *addJSONEnd(char *ptr)
1363 {
1364  char *ptro;
1365 
1366  strcat(ptr,"}\n");
1367  ptro = ptr + (int)strlen(ptr);
1368  return ptro;
1369 }
1370 
1371 char *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 
1380 char *addJSONNodeEnd(char *ptr)
1381 {
1382  char *ptro;
1383 
1384  strcat(ptr,"]\n");
1385  ptro = ptr + (int)strlen(ptr);
1386  return ptro;
1387 }
1388 
1389 char *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 
1401 char *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 
1413 char *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 
1436 char *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 
1466 {
1467  int prepareJSONHeader();
1468 
1469  if(isSMI){}
1470  if(JSONHeader[0] == '\0')
1472  return(JSONHeader);
1473 }
1474 
1475 int 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 
1493 int 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++;
1575 if(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  /*
1642 if(!selective)
1643 printf(" Nodes&Servers %s\n",JSONBuffer);
1644 else
1645 printf(" Nodes&Servers %s\n",browserp->JSONBuffer);
1646  */
1647  return(1);
1648 }
1649 
1650 int 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  {
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++;
1739 if(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  /*
1810 if(!selective)
1811 printf(" Nodes&Servers %s\n",JSONBuffer);
1812 else
1813 printf(" Nodes&Servers %s\n",browserp->JSONBuffer);
1814  */
1815 printf("%s\n",browserp->JSONSmiBuffer);
1816  return(1);
1817 }
1818 
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);
1836 if(WebDID_Debug)
1837 printf(" Header %s\n",JSONHeader);
1838  return(1);
1839 }
1840 
1841 char *JSONServices = 0;
1843 char *prepareJSONServiceList(SERVER *servp, char *node, int pid, BROWSER *browserp)
1844 {
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;
1858  }
1859  else if (JSONServicesSize < n_services*256)
1860  {
1861  free(JSONServices);
1862  JSONServicesSize = n_services*256;
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 /*
1890 printf("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 
1922 
1923 char *prepareJSONSmiObjectList(SERVER *servp, char *node, int pid, BROWSER *browserp)
1924 {
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;
1933  int findSmiServices();
1934 
1935 printf("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;
1942  }
1943  else if (JSONSmiServicesSize < n_services*512)
1944  {
1946  JSONSmiServicesSize = n_services*512;
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 
1965 printf("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 /*
1986 printf("Service type = %d\n",servicep->type);
1987 */
1988 printf("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);
2040 printf("%s\n",JSONSmiServices);
2041  return JSONSmiServices;
2042 }
2043 
2044 void 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 
2061 int findSmiServices(BROWSER *browserp, SERVER *servp)
2062 {
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 
2123 int findSmiModeObj(DNS_SERVICE_INFO *serviceptr, int n_services, char *name)
2124 {
2125  int i;
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");
2145 printf("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  {
2152 printf("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 
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 
2209 int 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 
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 
2260 void did_prepare_command(char *str, char *service, char *format)
2261 {
2262 char type;
2263 int num;
2264 int size, full_size = 0;
2265 char *ptr;
2266 static int last_size = 0;
2267 static void *last_buffer = 0;
2268 void *buffer_ptr;
2269 char *str_ptr;
2270 void 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 
2326 int 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 
2336 int 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 
2365 void did_read_string(char type, int num, void **buffer_ptr, char **str_ptr)
2366 {
2367 int i, ret = 0;
2368 float ff;
2369 double dd;
2370 void *ptr;
2371 char *strp, *ptr1;
2372 char 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 }
int no_link_int
Definition: webDid.c:109
NODE * Node_head
Definition: webDid.c:28
char * addJSONNodeEnd(char *ptr)
Definition: webDid.c:1380
#define MAX_NAME
Definition: dim.h:182
#define my_ctime(t, str, size)
Definition: dim_common.h:275
Definition: dns.c:26
char * JSONBuffer
Definition: webDid.c:90
int N_servers
Definition: webDid.c:105
int n_browsers
Definition: webDid.c:44
void print_service_standard(int *buff, int size)
Definition: webDid.c:1084
int delete_browser(BROWSER *browserp)
Definition: webDid.c:627
int n_services
Definition: webDid.c:70
char Title[128]
Definition: webDid.c:120
struct objstate OBJSTATE
char * getJSONSmiBuffer(char *node, int browser)
Definition: webDid.c:1436
int N_services
Definition: webDid.c:106
char * prepareJSONServiceList(SERVER *servp, char *node, int pid, BROWSER *browserp)
Definition: webDid.c:1843
unsigned dic_info_service_stamped(char *serv_name, int req_type, int req_timeout, void *serv_address, int serv_size, void(*usr_routine)(), dim_long tag, void *fill_addr, int fill_size)
Definition: dic.c:613
void dis_disable_padding()
Definition: copy_swap.c:30
char * Curr_service_list
Definition: webDid.c:113
unsigned dic_info_service(char *serv_name, int req_type, int req_timeout, void *serv_address, int serv_size, void(*usr_routine)(), dim_long tag, void *fill_addr, int fill_size)
Definition: dic.c:601
struct item SERVER
struct nitem * next
Definition: webDid.c:21
char * prepareJSONSmiObjectList(SERVER *servp, char *node, int pid, BROWSER *browserp)
Definition: webDid.c:1923
Definition: webDid.c:30
int read_str_char(char *str, char *cc)
Definition: webDid.c:2336
void got_update_services(BROWSER **tag, char *buffer, int *size)
Definition: webDid.c:436
void print_service_short(short *buff, int size)
Definition: webDid.c:1172
int busy
Definition: did.h:52
int dim_set_dns_node(char *node)
Definition: open_dns.c:50
struct sitem CURR_SERVICE
int findSmiModeObj(DNS_SERVICE_INFO *serviceptr, int n_services, char *name)
Definition: webDid.c:2123
int WebDID_Debug
Definition: webServer.c:7
CURR_SERVICE * servicep
Definition: webDid.c:73
int JSONSmiBufferSize
Definition: webDid.c:77
char * update_smi_objects(char *node, char *server, int pid, int browser)
Definition: webDid.c:487
Definition: did.h:42
time_t last_changed
Definition: webDid.c:68
int i
Definition: db_dim_client.c:21
BROWSER * Browser_head
Definition: webDid.c:88
char str[80]
Definition: test_client.c:7
#define MONITORED
Definition: dim_common.h:9
time_t last_subscribed
Definition: webDid.c:42
void did_read_string(char type, int num, void **buffer_ptr, char **str_ptr)
Definition: webDid.c:2365
void did_prepare_command(char *str, char *service, char *format)
Definition: webDid.c:2260
char node[MAX_NODE_NAME]
Definition: dim.h:338
int find_services(char *pattern, int conn_id, int browser, int force)
Definition: webDid.c:842
FILE * fptr
Definition: webDid.c:110
SERVER * Got_Service_List
Definition: webDid.c:116
char Curr_view_opt_par[80]
Definition: webDid.c:100
char * JSONServices
Definition: webDid.c:1841
int dtq_create()
Definition: dtq.c:353
void * buffer_str
Definition: webDid.c:38
int n_clients
Definition: dim.h:334
void * malloc()
Definition: EventBuilder.cc:99
char id[4]
Definition: FITS.h:71
int JSONBufferSize
Definition: webDid.c:91
int dic_get_dns_port()
Definition: open_dns.c:130
char * update_services(char *node, char *server, int pid, int browser)
Definition: webDid.c:448
int match
Definition: webDid.c:24
int sid
Definition: webDid.c:33
char Curr_service_format[256]
Definition: webDid.c:102
char Curr_service_name[132]
Definition: webDid.c:101
int sid
Definition: webDid.c:51
void update_servers(int *tag, DNS_DID *buffer, int *size)
Definition: webDid.c:304
int check_browser_changes(char *service, int conn_id, int subscribe, int req, int browser, int force)
Definition: webDid.c:789
char task[MAX_TASK_NAME]
Definition: dim.h:339
char * addJSONChildEnd(char *ptr, int sep)
Definition: webDid.c:1401
int hasSMI
Definition: webDid.c:26
int update_command_data(char *service, int conn_id, BROWSER *browserp)
Definition: webDid.c:696
int dic_get_quality(unsigned serv_id)
Definition: dic.c:937
CURR_SERVICE * Curr_service_head
Definition: webDid.c:46
void get_curr_service_format()
Definition: webDid.c:516
void got_update_smi_objects(BROWSER **tag, char *buffer, int *size)
Definition: webDid.c:475
int getNodeLabel(char *name, char *label)
Definition: webDid.c:1475
time_t last_updated
Definition: webDid.c:66
char * JSONBuffer
Definition: webDid.c:74
char name[132]
Definition: did.h:46
SLL * sll_get_next(SLL *item)
Definition: sll.c:50
DNS_SERVER_INFO server
Definition: dim.h:345
int Curr_view_opt
Definition: webDid.c:99
char * addJSONChildStart(char *ptr, char *child, int sep)
Definition: webDid.c:1389
int prepareJSONTree(char *node, BROWSER *browserp)
Definition: webDid.c:1493
struct bitem BROWSER
char name[MAX_NAME]
Definition: webDid.c:49
int JSONServicesSize
Definition: webDid.c:1842
int dim_get_dns_node(char *node)
Definition: open_dns.c:72
int get_type_size(char type)
Definition: webDid.c:2226
int mode_index
Definition: webDid.c:52
int did_write_string(char type, int num, void **buffer_ptr, int ssize)
Definition: webDid.c:980
time_t last_updated
Definition: webDid.c:43
int JSONSmiBufferSize
Definition: webDid.c:96
char * service_format_ptr
Definition: webDid.c:80
int matchString(char *wzString, char *wzPattern)
Definition: webDid.c:2209
struct nitem NODE
Definition: dim.h:536
int n_servers
Definition: webDid.c:71
void print_service_double(double *buff, int size)
Definition: webDid.c:1320
char name[MAX_NAME]
Definition: webDid.c:32
void print_service_longlong(longlong *buff, int size)
Definition: webDid.c:1128
struct sitem * next
Definition: webDid.c:31
void dtq_start_timer(int time, void(*user_routine)(), dim_long tag)
Definition: dtq.c:790
int isSMI
Definition: webDid.c:17
void dim_init()
Definition: dim_thr.c:111
int dic_cmnd_service(char *serv_name, void *serv_address, int serv_size)
Definition: dic.c:694
char * Curr_client_list
Definition: webDid.c:114
BROWSER * find_browser(int id)
Definition: webDid.c:253
int type
void update_smi_state(OBJSTATE **tag, char *data, int *size)
Definition: webDid.c:2044
void * buffer
Definition: webDid.c:34
void sll_init(SLL *head)
Definition: sll.c:14
int sll_insert_queue(SLL *head, SLL *item)
Definition: sll.c:20
char * JSONSmiServices
Definition: webDid.c:1920
int busy
Definition: webDid.c:25
static char no_link_str[5]
Definition: webDid.c:108
void print_service_float(float *buff, int size)
Definition: webDid.c:1287
DNS_SERVICE_INFO * service_ptr
Definition: did.h:45
int str_size
Definition: webDid.c:40
char * addJSONEnd(char *ptr)
Definition: webDid.c:1362
char name[MAX_NAME]
Definition: dim.h:331
#define MAX_TASK_NAME
Definition: dim.h:181
long dim_long
Definition: dim_common.h:57
struct item * next
Definition: did.h:43
struct bitem * next
Definition: webDid.c:62
int n_domains
Definition: webDid.c:82
int Curr_service_id
Definition: webDid.c:115
int curr_smidomain_nobjs
Definition: webDid.c:85
SERVER * Got_Client_List
Definition: webDid.c:117
Warning because the service this data corrsponds to might have been last updated longer ago than Local time
Definition: smartfact.txt:92
void check_browser(BROWSER *tag)
Definition: webDid.c:644
char * addJSONNodeStart(char *ptr, char *node)
Definition: webDid.c:1371
int sll_remove(SLL *head, SLL *item)
Definition: sll.c:74
time_t last_polled
Definition: webDid.c:67
int did_init(char *local_node, int dns_port)
Definition: webDid.c:122
BROWSER * create_browser(int id)
Definition: webDid.c:663
DNS_SERVER_INFO server
Definition: did.h:44
static char no_link
Definition: webDid.c:107
void dic_disable_padding()
Definition: copy_swap.c:25
int buffer[BUFFSIZE]
Definition: db_dim_client.c:14
int JSONSmiServicesSize
Definition: webDid.c:1921
int status
Definition: dim.h:333
int prepareJSONSmiTree(char *node, BROWSER *browserp)
Definition: webDid.c:1650
int find_service_pattern(NODE *nodep, SERVER *servpp, char *pattern, int *n_servers)
Definition: webDid.c:208
int id
Definition: webDid.c:63
void prepare_browser_tree()
Definition: webDid.c:284
CURR_SERVICE * find_curr_service(char *service)
Definition: webDid.c:238
char JSONHeader[256]
Definition: webDid.c:92
int checkSmiObjName(DNS_SERVICE_INFO *servicep)
Definition: webDid.c:2161
char * JSONSmiBuffer
Definition: webDid.c:76
Definition: webDid.c:20
int size
Definition: db_dim_server.c:17
float data[4 *1440]
int size
Definition: webDid.c:36
int Timer_q
Definition: webDid.c:119
void free(void *mem)
char * addJSONStart(char *ptr)
Definition: webDid.c:1353
char * getJSONBuffer(char *node, int browser)
Definition: webDid.c:1413
int buffer_str_size
Definition: webDid.c:39
int delete_curr_service(CURR_SERVICE *servicep)
Definition: webDid.c:612
int n_nodes
Definition: webDid.c:72
int64_t longlong
Definition: dim_common.h:56
void sendData(int conn_id, char *buffer, int type)
Definition: webServer.c:240
int web_get_node_name(char *node, char *name)
Definition: webTcpip.c:278
void dim_print_date_time()
Definition: utilities.c:134
char state[512]
Definition: webDid.c:50
void * browserp
Definition: webDid.c:53
Definition: dim.h:344
int buff[BUFFSIZE]
Definition: db_dim_client.c:15
SERVER * server_head
Definition: webDid.c:22
SERVER * find_server(NODE *nodep, int pid)
Definition: webDid.c:157
int conn_id
Definition: webDid.c:69
int curr_smidomain_size
Definition: webDid.c:84
void get_service_format(char *buffer, char *service, char *format)
Definition: webDid.c:569
int JSONBufferSize
Definition: webDid.c:75
int n_services
Definition: dim.h:341
int buffer_size
Definition: webDid.c:35
int isSMI
Definition: webDid.c:81
char JSONSmiHeader[256]
Definition: webDid.c:93
int read_str_int(char *str)
Definition: webDid.c:2326
#define ONCE_ONLY
Definition: dim_common.h:7
void recv_service_info(void **tag, int *buffer, int *size)
Definition: webDid.c:870
void print_service_char(char *buff, int size)
Definition: webDid.c:1216
int find_server_service_pattern(SERVER *servp, char *pattern)
Definition: webDid.c:189
int First_time
Definition: webDid.c:98
NODE * find_node(char *node)
Definition: webDid.c:174
int subscribe
Definition: webDid.c:64
void dic_release_service(unsigned service_id)
Definition: dic.c:1025
int N_nodes
Definition: webDid.c:104
DNS_SERVICE_INFO services[1]
Definition: dim.h:346
time_t timestamp
Definition: webDid.c:37
char * dic_get_format(unsigned serv_id)
Definition: dic.c:961
void sprintf_html(char *str, int n, int value)
Definition: webDid.c:1070
time_t last_subscribed
Definition: webDid.c:65
sprintf(name1,"NewService%d", i)
char * JSONSmiBuffer
Definition: webDid.c:95
char curr_command[MAX_NAME]
Definition: webDid.c:79
OBJSTATE * smidomainp
Definition: webDid.c:86
int match
Definition: webDid.c:15
#define DNS_PORT
Definition: dim.h:139
char * getJSONHeader(int isSMI)
Definition: webDid.c:1465
char pattern[256]
Definition: webDid.c:78
void print_service_formatted(CURR_SERVICE *servicep, void *buff, int size)
Definition: webDid.c:916
int prepareJSONHeader()
Definition: webDid.c:1819
char * Service_content_str
Definition: webDid.c:112
Definition: webDid.c:61
int update_service_data(char *service, int conn_id, int subscribe, int req, int browser, int force)
Definition: webDid.c:718
int Curr_service_print_type
Definition: webDid.c:103
char curr_smidomain[MAX_NAME]
Definition: webDid.c:83
int findSmiServices(BROWSER *browserp, SERVER *servp)
Definition: webDid.c:2061
int conn_id
Definition: webDid.c:41
int dic_get_timestamp(unsigned serv_id, int *secs, int *milisecs)
Definition: dic.c:984