Changeset 18920


Ignore:
Timestamp:
10/18/17 13:54:41 (7 years ago)
Author:
tbretz
Message:
Updated to v20r20 - This also includes some minor fixes, I requested.
Location:
trunk/FACT++/dim
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/dim/README_v20.txt

    r18349 r18920  
    11
    2                     DIM version 20r15 Release Notes
     2                    DIM version 20r20 Release Notes
    33
    44Notes 1 and 2 for Unix Users only
     
    1717                Dns </dev/null >& dns.log &
    1818
    19 NOTE 3: The Version Number service provided by servers is now set to 2015.
     19NOTE 3: The Version Number service provided by servers is now set to 2020.
     20
     2106/07/2017
     22Changes for version 2020:
     23    - All DIM log messages can now be caught by declaring an error_hlandler.
     24    - Connect calls now use a non-blocking socket to avoit blocking for a long time (particularly in Windows).
     25    - New re-designed version of webDid.
     26    - Added conditional compilation settings for LABVIEWGSI/PHARLAP.
     27
     28
     2920/01/2017
     30Changes for version 2019:
     31    - Changed slightly the definition of DIM constants in C++, they clashed with LHCb/ROOT software.
     32    - A server didn't work properly when declaring the same server name to two different dnss.
     33      Although this is still not allowed, because it would mean several services with the same name
     34      in the same server (and couldn't resolve which one should be sent to which client), now
     35      if the user declares the same server name a "-n" (where n is the dns instance number) will
     36      be appended to the server name.
     37    - Fixed a bug reported by Alice, whereby if a tcpip error (broken pipe) got received when
     38      updating a service following a client request, the server would crash.
     39    - Fixed a deadlock in C++
     40
     41
     4230/06/2016
     43Changes for version 2018:
     44    - Removed the function do_dis_add_cmnd(), had became obsolete by do_dis_add_cmnd_dns().
     45    - DIM now accepts servers to keep running even though they publish duplicated services:
     46      - If all services are duplicated the server will exit like before
     47      - If the server name is duplicated the server will also exit like before
     48      - Otherwise the server will keep running providing only the non-duplicated services
     49      - The server will print the name of each duplicated service to the logfile/stdout
     50      - A DIM error handler can be installed by the user to detect or change this behaviour
     51      - This new feature can only be used if both the Server and the DNS are using this new version
     52        (otherwise the old behaviour will occur)
     53    - The DimBrowser class now accepts to browse over DIM Servers with no name
     54
     55
     5624/03/2016
     57Changes for version 2017:
     58    - Removed the function do_dis_add_service(), became obsolete by do_dis_add_service_dns().
     59    - On Windows servers might not reconnect after DNS restart. Bug introduced in version v20r14
     60      (when the keepalive mechanism was introduced for TCPIP client connections). Fixed.
     61
     62
     6304/12/2015
     64Changes for version 2016:
     65    - DIM had stopped working on MAC OS X, since v20r12 and the replacement of select() by poll().
     66      This is now fixed.
     67
    2068
    216901/09/2015
    2270Changes for version 2015:
    2371    - A DIM Server did not properly accept a DimServer::stop(), folowed by a DimServer::start(),
    24       also DID didn't cope with the above, in particular if the server changed name - Fixed.
    2572
    2673
  • trunk/FACT++/dim/WebDID/did.js

    r18058 r18920  
    386386    {
    387387        serviceInfoArea.update("Updating - state "+HTTPPacket.readyState+"...");
     388console.log("receiveing", HTTPPacket.readyState);
    388389        if ( HTTPPacket.readyState != 4 )
    389390                return;
     
    399400//              {
    400401                        serviceInfoArea.update(HTTPPacket.responseText);
     402console.log("received answer", HTTPPacket.responseText);
    401403                        serviceInfoArea.setVisible(1);
    402404                        commandInfoArea.setVisible(0);
  • trunk/FACT++/dim/dim/dim.h

    r18349 r18920  
    1414#include "dim_common.h"
    1515
    16 #define DIM_VERSION_NUMBER 2015
    17 
    18 
     16#define DIM_VERSION_NUMBER 2020
     17
     18#ifdef LABVIEWGSI
     19/*this is a hack, but we have to overcome the problem that LabVIEW uses Motorola endian on an Intel machine*/
     20#define MY_LITTLE_ENDIAN        0x2
     21#define MY_BIG_ENDIAN           0x1
     22#else
    1923#define MY_LITTLE_ENDIAN        0x1
    2024#define MY_BIG_ENDIAN           0x2
     25#endif
    2126
    2227#define VAX_FLOAT               0x10
     
    163168#define MAX_CONNS               1024
    164169#define ID_BLOCK                512
     170#ifdef LABVIEWGSI
     171/*changed buffer size to allow LabVIEW to connect to itself*/
     172#define TCP_RCV_BUF_SIZE        /*16384*//*32768*//*65536*/262144
     173#else
    165174#define TCP_RCV_BUF_SIZE        /*16384*//*32768*/65536
     175#endif
    166176#define TCP_SND_BUF_SIZE        /*16384*//*32768*/65536
    167177#endif
     
    205215#define TEST_WRITE_TAG          25              /* DTQ tag for test writes   */
    206216#define WRITE_TMOUT                     5               /* Interval to wait while writing.    */
     217#ifndef WIN32
     218#define CONNECT_TMOUT           1               /* Interval to wait while connecting.    */
     219#else
     220#define CONNECT_TMOUT           2               /* Interval to wait while connecting.    */
     221#endif
    207222
    208223#define OPN_MAGIC               0xc0dec0de      /* Magic value 1st packet    */
     
    287302        int size;
    288303        int type;
     304        char dup_info[1];
    289305} DNS_DIS_PACKET;
    290306
  • trunk/FACT++/dim/dim/dim_common.h

    r18058 r18920  
    1 #ifndef __COMMONDEFS
    2 #define __COMMONDEFS
     1#ifndef __DIM_COMMONDEFS
     2#define __DIM_COMMONDEFS
    33
    44/* Service type definition */
    55
    6 #ifndef ONCE_ONLY
     6#ifndef DIM_DEFINITIONS_DECLARED
     7#define DIM_DEFINITIONS_DECLARED
     8
     9#ifdef __cplusplus
     10static const int ONCE_ONLY=     0x01;
     11static const int TIMED=         0x02;
     12static const int MONITORED=     0x04;
     13static const int COMMAND=       0x08;
     14static const int DIM_DELETE=    0x10;
     15static const int MONIT_ONLY=    0x20;
     16static const int UPDATE=        0x40;
     17static const int TIMED_ONLY=    0x80;
     18static const int MONIT_FIRST=   0x100;
     19static const int MAX_TYPE_DEF=  0x100;
     20static const int STAMPED=       0x1000;
     21#else
    722#define ONCE_ONLY       0x01
    823#define TIMED           0x02
     
    1631#define MAX_TYPE_DEF    0x100
    1732#define STAMPED       0x1000
     33#endif
    1834
    1935typedef enum { SRC_NONE, SRC_DIS, SRC_DIC, SRC_DNS, SRC_DNA, SRC_USR }SRC_TYPES;
  • trunk/FACT++/dim/src/dic.c

    r18349 r18920  
    520520        int once_only, size = 0;
    521521        register DIC_SERVICE *servp;
    522        
     522        char str[512];
     523
    523524/*
    524525dim_print_date_time();
     
    554555                        if((servp->pending == WAITING_DNS_UP) || (servp->pending == WAITING_DNS_ANSWER))
    555556                        {
     557                                sprintf(str, "Client Sending Command: Command %s discarded, no DNS answer\n", servp->serv_name);
     558                                error_handler(0, DIM_ERROR, DIMDNSCNERR, str);
     559/*
    556560                                dim_print_date_time();
    557                                 printf(" Client Sending Command: Command %s discarded, no DNS answer\n", servp->serv_name);
     561                                printf("Client Sending Command: Command %s discarded, no DNS answer\n", servp->serv_name);
    558562                                fflush(stdout);
     563*/
    559564                        }
    560565/*
     
    18941899        static int serv_packet_size = 0;
    18951900    int type, ret;
     1901        char str[256];
    18961902
    18971903        if( !serv_packet_size ) {
     
    19121918        if(!ret)
    19131919        {
    1914                 dim_print_date_time();
    1915                 printf(" Client Sending Service Request: Couldn't write to Conn %3d : Server %s@%s service %s\n",
     1920                sprintf(str, "Client Sending Service Request: Couldn't write to Conn %3d : Server %s@%s service %s\n",
    19161921                        conn_id, Net_conns[conn_id].task, Net_conns[conn_id].node, servp->serv_name);
    1917                 fflush(stdout);
     1922                error_handler(0, DIM_ERROR, DIMTCPWRTMO, str);
    19181923        }
    19191924        return(ret);
     
    19611966        int ret;
    19621967        CMNDCB_ITEM *itemp;
     1968        char str[256];
    19631969
    19641970        size = servp->fill_size;
     
    20332039        if(!ret)
    20342040        {
    2035                 dim_print_date_time();
    2036                 printf(" Client Sending Command: Couldn't write to Conn %3d : Server %s@%s\n",conn_id,
     2041                sprintf(str, "Client Sending Command: Couldn't write to Conn %3d : Server %s@%s\n", conn_id,
    20372042                        Net_conns[conn_id].task, Net_conns[conn_id].node);
    2038                 fflush(stdout);
     2043                error_handler(0, DIM_ERROR, DIMTCPWRTMO, str);
    20392044        }
    20402045        return(ret);
  • trunk/FACT++/dim/src/diccpp.cxx

    r15282 r18920  
    987987        ret = itsData[1]->getToken(currToken);
    988988        if(!ret) return 0;
    989         server = currToken;
    990         ret = itsData[1]->getToken(currToken);
     989        if(!itsData[1]->cmpToken((char *)"@"))
     990        {
     991                server = currToken;
     992                ret = itsData[1]->getToken(currToken);
     993        }
    991994        if(!itsData[1]->cmpToken((char *)"@"))
    992995                return 0;
  • trunk/FACT++/dim/src/dim_thr.c

    r15282 r18920  
    736736        else if(pclass == 2)
    737737                p = REALTIME_PRIORITY_CLASS;
     738/*added by dietrich beck, GSI*/
     739#ifdef PHARLAP
     740        ret = 1;
     741#else
    738742        ret = SetPriorityClass(hProc, p);
     743#endif
    739744        if(ret)
    740745          return 1;
     
    755760        hProc = GetCurrentProcess();
    756761
     762/*added by dietrich beck, GSI*/
     763#ifdef PHARLAP
     764        ret = NORMAL_PRIORITY_CLASS;
     765#else
    757766        ret = GetPriorityClass(hProc);
    758         if(ret == 0)
     767#endif
     768        if (ret == 0)
    759769          return 0;
    760770        if(ret == IDLE_PRIORITY_CLASS)
  • trunk/FACT++/dim/src/dis.c

    r18349 r18920  
    178178                                                                   void (*user_routine)(), dim_long tag, dim_long dnsid ) );
    179179_DIM_PROTO( static DIS_DNS_CONN *create_dns, (dim_long dnsid) );
     180/*
     181_DIM_PROTO( int do_dis_remove_service, (unsigned service_id, int do_stop_serving, void **dnsp ) );
     182_DIM_PROTO( void do_dis_stop_serving_dns, (DIS_DNS_CONN *dnsp ) );
     183*/
    180184
    181185void dis_set_debug_on()
     
    324328}
    325329
    326 static unsigned do_dis_add_service( char *name, char *type, void *address, int size,
    327                                                                    void (*user_routine)(), dim_long tag )
    328 {
    329         return do_dis_add_service_dns( name, type, address, size,
    330                                                                    user_routine, tag, 0 );
    331 }
    332 
    333330#ifdef VxWorks
    334331void dis_destroy(int tid)
     
    379376        DISABLE_AST
    380377*/
    381         ret = do_dis_add_service( name, type, address, size, user_routine, tag);
     378        ret = do_dis_add_service_dns( name, type, address, size, user_routine, tag, 0);
    382379#ifdef VxWorks
    383380        servp = (SERVICE *)id_get_ptr(ret, SRC_DIS);
     
    489486}
    490487
    491 static unsigned do_dis_add_cmnd( char *name, char *type, void (*user_routine)(), dim_long tag)
    492 {
    493         return do_dis_add_cmnd_dns(name, type, user_routine, tag, 0);
    494 }
    495 
    496488unsigned dis_add_cmnd( char *name, char *type, void (*user_routine)(), dim_long tag )
    497489{
     
    501493        DISABLE_AST
    502494*/
    503         ret = do_dis_add_cmnd( name, type, user_routine, tag );
     495        ret = do_dis_add_cmnd_dns( name, type, user_routine, tag, 0 );
    504496/*
    505497        ENABLE_AST
     
    639631}
    640632
     633int decode_duplicated_info(char *info, char *sname)
     634{
     635        int n_dupl;
     636/*
     637        int first_service = 1;
     638*/
     639        unsigned service_id;
     640        char *ptr;
     641        SERVICE *servp;
     642        char str[256];
     643
     644        ptr = strchr(info,' ');
     645        if(ptr)
     646        {
     647                *ptr = '\0';
     648                strcpy(sname, info);
     649                ptr++;
     650                sscanf(ptr,"%d",&n_dupl);
     651        }
     652        ptr = strchr(ptr,' ');
     653        while(ptr)
     654        {
     655                ptr++;
     656                sscanf(ptr,"%x",&service_id);
     657                if(service_id)
     658                {
     659                        service_id &= 0x0FFFFFFF;
     660                        servp = (SERVICE *)id_get_ptr(service_id, SRC_DIS);
     661                        if(servp)
     662                        {
     663                                if((unsigned)servp->id == service_id)
     664                                {
     665                                        servp->registered = -1;
     666/*
     667                                        if(first_service)
     668                                        {
     669                                                strcat(sname, " (ex: ");
     670                                                strcat(sname, servp->name);
     671                                                strcat(sname, ")");
     672                                                first_service = 0;
     673                                        }
     674*/
     675/*
     676if(Debug_on)
     677{
     678*/
     679                                        sprintf(str, "Service %s already declared\n", servp->name);
     680                                        error_handler(0, DIM_WARNING, DIMDNSDUPLC, str, -1);
     681                                /*
     682}
     683*/
     684                                }
     685                        }
     686                }
     687                ptr = strchr(ptr,' ');
     688        }
     689        return(n_dupl);
     690}
     691
    641692void recv_dns_dis_rout( int conn_id, DNS_DIS_PACKET *packet, int size, int status )
    642693{
    643         char str[128];
     694        char str[MAX_NAME*2], dupl_server[MAX_NAME*2];
    644695        int dns_timr_time;
    645696        extern int rand_tmout(int, int);
     
    649700        extern void do_dis_stop_serving_dns(DIS_DNS_CONN *);
    650701        DIS_DNS_CONN *dnsp;
    651         int type, exit_code;
     702        int type, exit_code, severity, n_dupl;
    652703
    653704        if(size){}
     
    709760                        break;
    710761                case DNS_DIS_KILL :
    711                         sprintf(str,
    712                                 "%s: Some Services already known to DNS",
    713                                 dnsp->task_name);
    714762                        /*
    715763                        exit(2);
    716764                        */
    717                         Serving = -1;
    718                         error_handler(0, DIM_FATAL, DIMDNSDUPLC, str, -1);
     765                        severity = DIM_FATAL;
     766                        if(size > DNS_DIS_HEADER)
     767                        {
     768                                n_dupl = decode_duplicated_info(packet->dup_info, dupl_server);
     769                                if(exit_code == 1)
     770                                {
     771                                        Serving = -1;
     772                                        sprintf(str, "%s: Server already declared by %s", dnsp->task_name, dupl_server);
     773                                }
     774                                else
     775                                {
     776                                        severity = DIM_WARNING;
     777                                        sprintf(str, "%s: %d Services already declared by %s", dnsp->task_name,
     778                                                n_dupl, dupl_server);
     779                                }
     780                        }
     781                        else
     782                        {
     783                                Serving = -1;
     784                                sprintf(str, "%s: Some Services already known to DNS",
     785                                                dnsp->task_name);
     786                        }
     787                        error_handler(0, severity, DIMDNSDUPLC, str, -1);
    719788                        /*
    720789                        do_dis_stop_serving_dns(dnsp);
     
    850919        n_services = 0;
    851920        tot_n_services = 0;
    852         if( flag == NONE ) {
     921        if( flag == NONE )
     922        {
    853923                dis_dns_p->n_services = htovl(n_services);
    854924                dis_dns_p->size = htovl( DIS_DNS_HEADER +
     
    878948                {
    879949                        if(servp->dnsp == dnsp)
    880                                 servp->registered  = 0;
     950                        {
     951                                if(servp->registered >= 0)
     952                                        servp->registered = 0;
     953                        }
    881954                }
    882955        }
     
    890963                if( flag == MORE )
    891964                {
    892                         if( servp->registered )
     965                        if( servp->registered != 0)
     966                        {
     967                                continue;
     968                        }
     969                }
     970                else if( flag == ALL )
     971                {
     972                        if( servp->registered < 0)
    893973                        {
    894974                                continue;
     
    10951175        char str0[MAX_NAME], str1[MAX_NAME],str2[MAX_NAME],
    10961176          str3[MAX_NAME],str4[MAX_NAME];
    1097         char task_name_aux[MAX_TASK_NAME];
     1177        char task_name_aux[MAX_TASK_NAME], task_name[MAX_NAME];
    10981178        extern int open_dns();
    10991179        extern DIS_DNS_CONN *dis_find_dns(dim_long);
     1180        extern int dis_find_dns_task(dim_long, char *);
    11001181        DIS_DNS_CONN *dnsp;
    11011182        unsigned int more_ids[10] = {0};
     1183        int n;
    11021184
    11031185        dis_init();
     
    11211203                dll_init( (DLL *) Client_head );
    11221204        }
     1205        strncpy( task_name, task, (size_t)MAX_NAME );
     1206        task_name[MAX_NAME-1] = '\0';
    11231207        if(dnsid == 0)
    11241208        {
     
    11271211        else if(!(dnsp = dis_find_dns(dnsid)))
    11281212        {
     1213                if((n = dis_find_dns_task(dnsid, task)) > 0)
     1214                {
     1215                        sprintf(task_name, "%s-%i", task, n);
     1216                }
    11291217                dnsp = create_dns(dnsid);
    11301218        }
     
    11331221        if(Dis_first_time)
    11341222        {
    1135                 strncpy( task_name_aux, task, (size_t)MAX_TASK_NAME );
     1223                strncpy( task_name_aux, task_name, (size_t)MAX_TASK_NAME );
    11361224                task_name_aux[MAX_TASK_NAME-1] = '\0';
    11371225                Port_number = SEEK_PORT;
     
    11531241                dnsp->dis_first_time = 0;
    11541242
    1155                 sprintf(str0, "%s/VERSION_NUMBER", task);
    1156                 sprintf(str1, "%s/CLIENT_LIST", task);
    1157                 sprintf(str2, "%s/SERVICE_LIST", task);
    1158                 sprintf(str3, "%s/SET_EXIT_HANDLER", task);
    1159                 sprintf(str4, "%s/EXIT", task);
    1160 
    1161                 more_ids[0] = do_dis_add_service_dns( str0, "L", &Version_number,
     1243                sprintf(str0, "%s/VERSION_NUMBER", task_name);
     1244                sprintf(str1, "%s/CLIENT_LIST", task_name);
     1245                sprintf(str2, "%s/SERVICE_LIST", task_name);
     1246                sprintf(str3, "%s/SET_EXIT_HANDLER", task_name);
     1247                sprintf(str4, "%s/EXIT", task_name);
     1248
     1249/*added by dietrich beck, GSI*/
     1250#ifdef LABVIEWGSI
     1251                Version_number = _swapl(Version_number); //need to swap this number, since we hacked MY_LITTLE_ENDIAN
     1252#endif
     1253                more_ids[0] = do_dis_add_service_dns(str0, "L", &Version_number,
    11621254                                                sizeof(Version_number), 0, 0, dnsid );
    11631255
     
    11691261                more_ids[4] = do_dis_add_cmnd_dns( str4, "L:1", exit_handler, 0, dnsid );
    11701262                more_ids[5] = 0;
    1171                 strcpy( dnsp->task_name, task );
     1263                strcpy( dnsp->task_name, task_name );
    11721264if(Debug_on)
    11731265{
    11741266dim_print_date_time();
    1175  printf("start serving %s\n",task);
     1267 printf("start serving %s\n",task_name);
    11761268}
    11771269        }
     
    12581350        int find_release_request();
    12591351        DIS_DNS_CONN *dnsp;
     1352        int ret = 1;
    12601353
    12611354        if(size){}
     
    13711464                if((type != MONIT_ONLY) && (type != UPDATE))
    13721465                {
    1373                         execute_service(newp->req_id);
     1466                        ret = execute_service(newp->req_id);
    13741467                }
    13751468                if((type != MONIT_ONLY) && (type != MONIT_FIRST))
     
    13831476                        }
    13841477                }
    1385                 if(new_client)
     1478                if((new_client) && (ret != -1))
    13861479                {
    13871480                        Last_client = conn_id;
     
    14001493        register REQUEST *reqp;
    14011494        register SERVICE *servp;
    1402         char str[80], def[MAX_NAME];
     1495        char str[256], def[MAX_NAME];
    14031496        int conn_id, last_conn_id;
    14041497        int *pkt_buffer, header_size, aux;
     
    14101503#endif
    14111504        FORMAT_STR format_data_cp[MAX_NAME/4];
     1505        int ret = 1;
    14121506
    14131507        reqp = (REQUEST *)id_get_ptr(req_id, SRC_DIS);
     
    15191613                        if(reqp->delay_delete > 1)
    15201614                        {
    1521                                 printf(" Server (Explicitly) Updating Service %s: Couldn't write to Conn %3d : Client %s@%s\n",
     1615                                sprintf(str, "Server (Explicitly) Updating Service %s: Couldn't write to Conn %3d : Client %s@%s\n",
    15221616                                        servp->name, conn_id,
    15231617                                        Net_conns[conn_id].task, Net_conns[conn_id].node);
     
    15251619                        else
    15261620                        {
    1527                                 printf(" Server Updating Service %s: Couldn't write to Conn %3d : Client %s@%s\n",
     1621                                sprintf(str, "Server Updating Service %s: Couldn't write to Conn %3d : Client %s@%s\n",
    15281622                                        servp->name, conn_id,
    15291623                                        Net_conns[conn_id].task, Net_conns[conn_id].node);
    15301624                        }
    1531                         fflush(stdout);
     1625                        error_handler(0, DIM_WARNING, DIMTCPWRTMO, str, -1);
    15321626                }
    15331627                if(reqp->delay_delete > 1)
     
    15391633                        reqp->delay_delete = 0;
    15401634                        release_conn(conn_id, 1, 0);
     1635                        ret = -1;
    15411636                }
    15421637        }
     
    15531648        if(reqp->delay_delete > 0)
    15541649                reqp->delay_delete--;
    1555         return(1);
     1650        return(ret);
    15561651}
    15571652
     
    15621657        static int packet_size = 0;
    15631658        int service_id;
     1659        char str[256];
    15641660
    15651661        reqp = (REQUEST *)id_get_ptr(req_id, SRC_DIS);
     
    15791675        if( !dna_write(reqp->conn_id, dis_packet, DIS_HEADER) )
    15801676        {
    1581                 dim_print_date_time();
    1582                 printf(" Server Removing Service: Couldn't write to Conn %3d : Client %s@%s\n",
     1677                sprintf(str, "Server Removing Service: Couldn't write to Conn %3d : Client %s@%s\n",
    15831678                        reqp->conn_id, Net_conns[reqp->conn_id].task, Net_conns[reqp->conn_id].node);
    1584                 fflush(stdout);
     1679                error_handler(0, DIM_WARNING, DIMTCPWRTMO, str, -1);
    15851680                release_conn(reqp->conn_id, 0, 0);
    15861681        }
     
    20582153        static int packet_size = 0;
    20592154        int conn_id;
    2060         char str[128];
     2155        char str[256];
    20612156
    20622157        DISABLE_AST
     
    20982193                if( !dna_write_nowait(conn_id, dis_packet, size + DIS_HEADER) )
    20992194                {
    2100                         dim_print_date_time();
    2101                         printf(" Server Sending Service: Couldn't write to Conn %3d : Client %s@%s\n",conn_id,
     2195                        sprintf(str, "Server Sending Service: Couldn't write to Conn %3d : Client %s@%s\n",conn_id,
    21022196                                Net_conns[conn_id].task, Net_conns[conn_id].node);
    2103                         fflush(stdout);
     2197                        error_handler(0, DIM_WARNING, DIMTCPWRTMO, str, -1);
    21042198                        release_conn(conn_id, 1, 0);
    21052199                }
     
    21112205
    21122206int dis_remove_service(unsigned service_id)
     2207{
     2208        int ret;
     2209        void *dnsp;
     2210        int do_dis_remove_service(unsigned, int , void **);
     2211
     2212        ret = do_dis_remove_service(service_id, 1, &dnsp);
     2213        return ret;
     2214}
     2215
     2216int do_dis_remove_service(unsigned service_id, int do_stop_serving, void **thednsp)
    21132217{
    21142218        register REQUEST *reqp, *auxp;
     
    21972301                if(n_services == 5)
    21982302                {
    2199                         if(Dis_conn_id)
    2200                         {
    2201                                 dna_close(Dis_conn_id);
    2202                                 Dis_conn_id = 0;
    2203                         }
    2204                         ENABLE_AST
     2303                        if(do_stop_serving)
     2304                        {
     2305                                if(Dis_conn_id)
     2306                                {
     2307                                        dna_close(Dis_conn_id);
     2308                                        Dis_conn_id = 0;
     2309                                }
     2310                                ENABLE_AST
     2311                        }
     2312                        else
     2313                        {
     2314                                *thednsp = dnsp;
     2315                                ENABLE_AST
     2316                                return -1;
     2317                        }
     2318
    22052319/*
    22062320                        dis_stop_serving();
     
    23382452
    23392453        dnsp = dis_find_dns(dnsid);
    2340         do_dis_stop_serving_dns(dnsp);
     2454        if(dnsp)
     2455                do_dis_stop_serving_dns(dnsp);
    23412456}
    23422457
     
    27012816                dim_print_date_time();
    27022817                dna_get_node_task(conn_id, node, task);
    2703                 printf(" Couldn't write to client %s@%s, releasing connection %d\n",
     2818                printf("Couldn't write to client %s@%s, releasing connection %d\n",
    27042819                        task, node, conn_id);
    27052820                fflush(stdout);
     
    29873102                        if(servp->dnsp != dnsp)
    29883103                                continue;
    2989                         if(servp->registered)
     3104                        if(servp->registered > 0)
    29903105                        {
    29913106/*
     
    30173132                                buff_ptr += (int)strlen(buff_ptr);
    30183133                        }
    3019                         else if(servp->registered < (Last_n_clients+1))
     3134                        else if((servp->registered > 0) && (servp->registered < (Last_n_clients+1)))
    30203135                        {
    30213136                                if(!done)
     
    33713486*/
    33723487        return dnsp;
     3488}
     3489
     3490int dis_find_dns_task(dim_long dnsid, char *task)
     3491{
     3492        DIS_DNS_CONN *dnsp;
     3493        int n = 0;
     3494
     3495        dnsp = (DIS_DNS_CONN *) DNS_head;
     3496        while ( (dnsp = (DIS_DNS_CONN *) dll_get_next( (DLL *) DNS_head, (DLL *) dnsp)))
     3497        {
     3498                if(!strcmp(dnsp->task_name, task))
     3499                        n++;
     3500        }
     3501        return n;
    33733502}
    33743503
  • trunk/FACT++/dim/src/discpp.cxx

    r18058 r18920  
    1818extern "C" {
    1919extern void dis_init();
     20extern int do_dis_remove_service(unsigned service_id, int do_stop_serving, void **dnsp );
     21extern void do_dis_stop_serving_dns(void *dnsp);
    2022
    2123static void user_routine( void *tagp, void **buf, int *size, int *first_time)
     
    10011003DimService::~DimService()
    10021004{
     1005        int ret = 0;
     1006        void *dnsp;
     1007
    10031008        DISABLE_AST
    10041009        if(itsName)
     
    10091014//              id_free(itsTagId, SRC_DIS);
    10101015        if(itsId)
    1011                 dis_remove_service( itsId );
     1016                ret = do_dis_remove_service( itsId, 0, &dnsp );
    10121017        itsId = 0;
    10131018        ENABLE_AST
     1019        if(ret == -1)
     1020        {
     1021                do_dis_stop_serving_dns(dnsp);
     1022        }
    10141023}
    10151024
     
    14871496DimCommand::~DimCommand()
    14881497{
     1498        int ret;
     1499        void *dnsp;
     1500
    14891501        DISABLE_AST
    14901502        delete[] itsName;
     
    14931505//              id_free(itsTagId, SRC_DIS);
    14941506        if(itsId)
    1495                 dis_remove_service( itsId );
     1507                ret = do_dis_remove_service( itsId, 0, &dnsp );
    14961508        itsId = 0;
    14971509        ENABLE_AST
     1510        if(ret == -1)
     1511        {
     1512                do_dis_stop_serving_dns(dnsp);
     1513        }
    14981514}
    14991515
     
    15141530DimRpc::~DimRpc()
    15151531{
     1532        int ret;
     1533        void *dnsp;
     1534
    15161535        DISABLE_AST
    15171536        delete[] itsName;
     
    15211540//              id_free(itsTagId, SRC_DIS);
    15221541        if(itsIdIn)
    1523                 dis_remove_service( itsIdIn );
     1542                ret = do_dis_remove_service( itsIdIn, 0, &dnsp );
    15241543        if(itsIdOut)
    1525                 dis_remove_service( itsIdOut );
     1544                ret = do_dis_remove_service( itsIdOut, 0, &dnsp );
    15261545        itsIdIn = 0;
    15271546        itsIdOut = 0;
    15281547        ENABLE_AST
     1548        if(ret == -1)
     1549        {
     1550                do_dis_stop_serving_dns(dnsp);
     1551        }
    15291552}
    15301553
  • trunk/FACT++/dim/src/dna.c

    r15282 r18920  
    1616#define DNA
    1717#include <dim.h>
     18#include <time.h>
    1819
    1920/* global definitions */
     
    353354        tcpip_code = dna_write_bytes(conn_id, &test_pkt, READ_HEADER_SIZE,0);
    354355        if(tcpip_failure(tcpip_code)) {
    355                  /* Connection lost. Signal upper layer ? */
     356/* Connection lost. Signal upper layer ? No -> creates a deadlock in the Timer Thread*/
     357/*
    356358                if(dna_connp->read_ast)
    357359                        dna_connp->read_ast(conn_id, NULL, 0, STA_DISC);
     360*/
    358361                return;
    359362        }
     
    624627        time_t oldest;
    625628        int oldesti = 0;
     629/*
    626630        extern time_t time();
     631*/
    627632
    628633        if(type == 0)
     
    822827        if (tcpip_failure(tcpip_code))
    823828        {
     829                if(src_type == SRC_DIS)
     830                        strcpy(src_type_str,"Server");
     831                else if(src_type == SRC_DIC)
     832                        strcpy(src_type_str,"Client");
     833                else
     834                        strcpy(src_type_str,"Unknown type");
    824835                dim_print_date_time();
    825                 printf(" Client Establishing Connection: Couldn't write to Conn %3d : Server %s@%s\n",conn_id,
    826                         Net_conns[conn_id].task, Net_conns[conn_id].node);
    827                 fflush(stdout);
     836                sprintf(str," %s Establishing Connection: Couldn't write to Conn %3d : Server %s@%s\n",
     837                                src_type_str, conn_id, Net_conns[conn_id].task, Net_conns[conn_id].node);
     838                if (!strcmp(server_task, "DIM_DNS"))
     839                        dna_report_error(conn_id, tcpip_code, str, DIM_ERROR, DIMDNSCNERR);
     840                else
     841                        dna_report_error(conn_id, tcpip_code, str, DIM_ERROR, DIMTCPCNERR);
    828842                dna_close(conn_id);
    829843                return(0);
     
    841855                    dna_report_error(conn_id, -1,
    842856                                     "Write timeout, disconnecting from", DIM_ERROR, DIMTCPWRTMO);
    843                         if(!find_pend_conn(Net_conns[conn_id].node, Net_conns[conn_id].task, 0, 0, 1))
     857                        if (!find_pend_conn(Net_conns[conn_id].node, Net_conns[conn_id].task, 0, 0, 1))
     858                        {
    844859                                ins_pend_conn(Net_conns[conn_id].node, Net_conns[conn_id].task, 0, 0, 1, time(NULL));
     860                        }
    845861                }
    846862                release_conn(conn_id);
  • trunk/FACT++/dim/src/dns.c

    r18097 r18920  
    116116                {
    117117                        dim_print_date_time();
    118                         printf(" Disconnect received - conn: %d to %s@%s\n", conn_id,
     118                        printf("Disconnect received - conn: %d to %s@%s\n", conn_id,
    119119                                Net_conns[conn_id].task,Net_conns[conn_id].node );
    120120                }
     
    126126                {
    127127                        dim_print_date_time();
    128                         printf(" Connection request received - conn: %d\n", conn_id);
     128                        printf("Connection request received - conn: %d\n", conn_id);
    129129                }
    130130                /* handle_conn( conn_id ); */
     
    141141                default:
    142142                        dim_print_date_time();
    143                         printf(" conn: %d to %s@%s, Bad packet\n", conn_id,
     143                        printf("conn: %d to %s@%s, Bad packet\n", conn_id,
    144144                                Net_conns[conn_id].task,Net_conns[conn_id].node );
    145145                        printf("packet->size = %d\n", vtohl(packet->size));
     
    155155        default:       
    156156                dim_print_date_time();
    157                 printf( " - DIM panic: recv_rout(): Bad switch, exiting...\n");
     157                printf( "- DIM panic: recv_rout(): Bad switch, exiting...\n");
    158158                abort();
    159159        }
     
    172172        }
    173173*/
     174}
     175
     176void create_service_entry( int conn_id, DIS_DNS_PACKET *packet, int i, int state)
     177{
     178        DNS_SERVICE *servp;
     179        int name_too_long = 0;
     180        char *ptrt;
     181        void service_insert();
     182
     183        if((int)strlen(Dns_conns[conn_id].task_name) == MAX_TASK_NAME-4-1)
     184                name_too_long = 1;
     185        servp = (DNS_SERVICE *)malloc(sizeof(DNS_SERVICE));
     186        if(name_too_long)
     187        {
     188                if(strstr(packet->services[i].service_name,"/CLIENT_LIST"))
     189                {
     190                        strncpy(Dns_conns[conn_id].long_task_name, packet->services[i].service_name,
     191                                (size_t)MAX_NAME);
     192                        ptrt = strstr(Dns_conns[conn_id].long_task_name,"/CLIENT_LIST");
     193                        *ptrt = '\0';
     194                }
     195        }
     196        strncpy( servp->serv_name,
     197                packet->services[i].service_name,
     198                (size_t)MAX_NAME );
     199        strncpy( servp->serv_def,
     200                packet->services[i].service_def,
     201                (size_t)MAX_NAME );
     202        servp->state = state;
     203        servp->conn_id = conn_id;
     204        servp->server_format = vtohl(packet->format);
     205        servp->serv_id = vtohl(packet->services[i].service_id);
     206        dll_insert_queue( (DLL *)
     207                Dns_conns[conn_id].service_head,
     208                (DLL *) servp );
     209        servp->node_head = (RED_NODE *) malloc(sizeof(NODE));
     210        dll_init( (DLL *) servp->node_head );
     211        servp->next = 0;
     212        if(state == 1)
     213        {
     214                service_insert( &(servp->next) );
     215                Dns_conns[conn_id].n_services++;
     216        }
     217}
     218
     219int warn_server(int conn_id)
     220{
     221        DNS_SERVICE *servp;
     222        DNS_DIS_PACKET *dis_packet;
     223        int n_dupl, dupl_conn_id;
     224        char vname[MAX_NAME], dupl_server[MAX_NAME];
     225        int type, size, dupl_id, kill_anyway, ret;
     226        char *ptr;
     227               
     228        ret = 1;
     229        type = DNS_DIS_KILL;
     230        n_dupl = 0;
     231        strcpy(vname, Dns_conns[conn_id].task_name);
     232        strcat(vname, "/VERSION_NUMBER");
     233        dupl_id = 0;
     234        kill_anyway = 0;
     235        dupl_conn_id = Dns_conns[conn_id].already;
     236        servp = (DNS_SERVICE *)Dns_conns[conn_id].service_head;
     237        while( (servp = (DNS_SERVICE *) dll_get_next(
     238                                (DLL *) Dns_conns[conn_id].service_head,
     239                                (DLL *) servp)) )
     240        {
     241                if(servp->state == -2)
     242                {
     243                        if(!dupl_id)
     244                        {
     245                                dupl_id = servp->serv_id;
     246                                sprintf(dupl_server,"%s(%d)@%s:%d",
     247                                        Dns_conns[dupl_conn_id].task_name,
     248                                        Dns_conns[dupl_conn_id].pid,
     249                                        Dns_conns[dupl_conn_id].node_name,
     250                                        Dns_conns[dupl_conn_id].port);
     251                        }
     252                        if(!strcmp(servp->serv_name, vname))
     253                                kill_anyway = 1;
     254                        n_dupl++;
     255                }
     256        }
     257/* allocate Header + space for <server_name>:<pid>@<node_name>:<port_number> + n duplicated + duplicated ids */
     258        dis_packet = (DNS_DIS_PACKET *)malloc(DNS_DIS_HEADER + MAX_NAME*2 + (n_dupl+1)*10);
     259        sprintf(dis_packet->dup_info, "%s %d", dupl_server, n_dupl);
     260        ptr = dis_packet->dup_info + strlen(dis_packet->dup_info);
     261        if(kill_anyway)
     262        {
     263                type |= (0x01 << (int)16) & (int)0xFFFF0000;
     264                dim_print_date_time();
     265printf("Server already declared by conn %d - %s@%s:%d (PID %d), Killing server conn %d - %s@%s:%d (PID %d) \n",
     266                        dupl_conn_id,
     267                        Dns_conns[dupl_conn_id].task_name,
     268                        Dns_conns[dupl_conn_id].node_name,
     269                        Dns_conns[dupl_conn_id].port,
     270                        Dns_conns[dupl_conn_id].pid,
     271                        conn_id,
     272                        Dns_conns[conn_id].task_name,
     273                        Dns_conns[conn_id].node_name,
     274                        Dns_conns[conn_id].port,
     275                        Dns_conns[conn_id].pid);
     276                fflush(stdout);
     277        }
     278        else
     279        {
     280                servp = (DNS_SERVICE *)Dns_conns[conn_id].service_head;
     281                while( (servp = (DNS_SERVICE *) dll_get_next(
     282                                        (DLL *) Dns_conns[conn_id].service_head,
     283                                        (DLL *) servp)) )
     284                {
     285                        if(servp->state == -2)
     286                        {
     287                                dupl_id = servp->serv_id;
     288                                sprintf(ptr," %08X", dupl_id);
     289                                ptr += 9;
     290                        }
     291                }
     292        }
     293        dis_packet->type = htovl(type);
     294        size = DNS_DIS_HEADER + strlen(dis_packet->dup_info);
     295/* Unfortunatelly the size is wrong, this is for backward compatibility on the server side (it tested the size)*/
     296        dis_packet->size = htovl(DNS_DIS_HEADER);
     297/*
     298printf("Sendig packet %s\n", dis_packet->dup_info);
     299*/
     300        if( !dna_write_nowait(conn_id, dis_packet, size) )
     301        {
     302                dim_print_date_time();
     303                printf("Kill Server: Couldn't write, releasing %d\n",conn_id);
     304                fflush(stdout);
     305                ret = 0;
     306        }
     307        free(dis_packet);
     308        return ret;
    174309}
    175310
     
    180315        int i, service_id;
    181316        int n_services;
    182         char *ptr, *ptr1, *ptrt;
     317        char *ptr, *ptr1;
    183318        int found;
    184319        void do_update_did();
     
    195330#endif
    196331        int update_did = 0;
     332/*
    197333        int name_too_long = 0;
     334*/
    198335        int rem_only = 0;
     336        int all_services_registered = -1;
    199337
    200338        Dns_conns[conn_id].validity = (int)time(NULL);
    201339        if( !Dns_conns[conn_id].service_head )
    202340        {
    203 
     341                all_services_registered = 0;
    204342                if(vtohl(packet->n_services) > 0)
    205343                {
     
    212350        {
    213351                        dim_print_date_time();
    214                         printf( " !!!! New Conn %3d : Server %s@%s (PID %d) registering %d services, to delete %d\n",
     352                        printf( "!!!! New Conn %3d : Server %s@%s (PID %d) registering %d services, to delete %d\n",
    215353                                conn_id, packet->task_name,
    216354                                packet->node_name,
     
    246384        {
    247385                        dim_print_date_time();
    248                         printf( " !!!! New Conn %3d : Server %s@%s (PID %d) registered %d services\n",
     386                        printf( "!!!! New Conn %3d : Server %s@%s (PID %d) registered %d services\n",
    249387                                conn_id, Dns_conns[conn_id].task_name,
    250388                                Dns_conns[conn_id].node_name,
     
    293431                                {
    294432                                        dim_print_date_time();
    295                                         printf(" Stop Server: Couldn't write, releasing %d\n",conn_id);
     433                                        printf("Stop Server: Couldn't write, releasing %d\n",conn_id);
    296434                                        fflush(stdout);
    297435                                }
    298436                                dim_print_date_time();
    299                                 printf(" Connection from %s refused, stopping server %s\n",
     437                                printf("Connection from %s refused, stopping server %s\n",
    300438                                                Dns_conns[conn_id].node_name,
    301439                                                Dns_conns[conn_id].task_name);
     
    332470                                dna_set_test_write(conn_id, dim_get_keepalive_timeout());
    333471                        dim_print_date_time();
    334                         printf( " Server %s out of error\n",
     472                        printf( "Server %s out of error\n",
    335473                                Dns_conns[conn_id].task_name );
    336474                        fflush(stdout);
     
    339477        }
    340478        n_services = vtohl(packet->n_services);
     479/*
    341480        if((int)strlen(Dns_conns[conn_id].task_name) == MAX_TASK_NAME-4-1)
    342481                name_too_long = 1;
     482*/
    343483        for( i = 0; i < n_services; i++ )
    344484        {
     
    347487        {
    348488                        dim_print_date_time();
    349                         printf( " Conn %3d : Server %s@%s (PID %d) registered %s\n",
     489                        printf( "Conn %3d : Server %s@%s (PID %d) registered %s\n",
    350490                                conn_id, Dns_conns[conn_id].task_name,
    351491                                Dns_conns[conn_id].node_name,
     
    359499                        if(!strcmp(packet->services[i].service_name, "DUMMY_UPDATE_PACKET"))
    360500                        {
     501                                all_services_registered = 1;
    361502                                do_inform_clients(conn_id);
    362503                                break;
     
    378519                                        {
    379520                                                dim_print_date_time();
    380                                                 printf(" Couldn't write, releasing %d\n",servp->conn_id);
     521                                                printf("Couldn't write, releasing %d\n",servp->conn_id);
    381522                                                fflush(stdout);
    382523                                        }
    383524                                        dim_print_date_time();
    384                                         printf(" Service %s already declared, killing server %s\n",
     525                                        printf("Service %s already declared, killing server %s\n",
    385526                                                servp->serv_name, Dns_conns[servp->conn_id].task_name);
    386527                                        fflush(stdout);
     
    395536                                        {
    396537                                                dim_print_date_time();
    397 printf(" Service %s already declared by conn %d - %s@%s:%d (PID %d), Redeclared by conn %d - %s@%s:%d (PID %d)(same server) - Closing both conns %d %d\n",
     538printf("Service %s already declared by conn %d - %s@%s:%d (PID %d), Redeclared by conn %d - %s@%s:%d (PID %d)(same server) - Closing both conns %d %d\n",
    398539                                                        servp->serv_name, servp->conn_id,
    399540                                                        Dns_conns[servp->conn_id].task_name,
     
    418559                                        else
    419560                                        {
    420                                                 Dns_conns[conn_id].already = 1;
    421 
     561                                                Dns_conns[conn_id].already = servp->conn_id;
     562                                                create_service_entry( conn_id, packet, i, -2);                 
     563/*DUPL
    422564                                                if( !dna_write_nowait(conn_id, &dis_packet, DNS_DIS_HEADER) )
    423565                                                {
     
    426568                                                        fflush(stdout);
    427569                                                }
     570*/
    428571                                                dim_print_date_time();
    429 printf(" Service %s already declared by conn %d - %s@%s:%d (PID %d), killing server conn %d - %s@%s:%d (PID %d) \n",
     572printf("Service %s already declared by conn %d - %s@%s:%d (PID %d), Warning server conn %d - %s@%s:%d (PID %d) \n",
    430573                                                        servp->serv_name, servp->conn_id,
    431574                                                        Dns_conns[servp->conn_id].task_name,
     
    439582                                                        Dns_conns[conn_id].pid);
    440583                                                fflush(stdout);
    441 
     584/*DUPL
    442585                                                release_conn(conn_id);
    443 
    444586                                                return(0);
     587*/
     588                                                if((!all_services_registered) && (n_services < MAX_REGISTRATION_UNIT))
     589                                                        all_services_registered = 1;
    445590                                        }
    446591#ifdef VMS
     
    481626                                                dll_remove((DLL *) servp);
    482627                                                service_remove(&(servp->next));
    483                                                 Curr_n_services--;
    484628                                                free(servp);
    485629                                                Dns_conns[conn_id].n_services--;
     
    489633                                                        {
    490634                                                                dim_print_date_time();
    491                                                                 printf( " Conn %3d : Server %s@%s unregistered All services, releasing it.\n",
     635                                                                printf("Conn %3d : Server %s@%s unregistered All services, releasing it.\n",
    492636                                                                        conn_id, Dns_conns[conn_id].task_name,
    493637                                                                        Dns_conns[conn_id].node_name );
     
    521665                if(!(servp = service_exists(packet->services[i].service_name)))
    522666                {
    523                         servp = (DNS_SERVICE *)malloc(sizeof(DNS_SERVICE));
    524                         if(name_too_long)
    525                         {
    526                                 if(strstr(packet->services[i].service_name,"/CLIENT_LIST"))
    527                                 {
    528                                         strncpy(Dns_conns[conn_id].long_task_name, packet->services[i].service_name,
    529                                                 (size_t)MAX_NAME);
    530                                         ptrt = strstr(Dns_conns[conn_id].long_task_name,"/CLIENT_LIST");
    531                                         *ptrt = '\0';
    532                                 }
    533                         }
    534                         strncpy( servp->serv_name,
    535                                 packet->services[i].service_name,
    536                                 (size_t)MAX_NAME );
    537                         strncpy( servp->serv_def,
    538                                 packet->services[i].service_def,
    539                                 (size_t)MAX_NAME );
    540                         servp->state = 1;
    541                         servp->conn_id = conn_id;
    542                         servp->server_format = vtohl(packet->format);
    543                         servp->serv_id = vtohl(packet->services[i].service_id);
    544                         dll_insert_queue( (DLL *)
    545                                           Dns_conns[conn_id].service_head,
    546                                           (DLL *) servp );
    547                         Dns_conns[conn_id].n_services++;
    548                         service_insert( &(servp->next) );
    549                         servp->node_head = (RED_NODE *) malloc(sizeof(NODE));
    550                         dll_init( (DLL *) servp->node_head );
    551                         Curr_n_services++;
     667                        create_service_entry( conn_id, packet, i, 1);                   
    552668                }
     669        }
     670        if((vtohl(packet->n_services) != 0) && Dns_conns[conn_id].already && all_services_registered)
     671        {
     672/*
     673                dim_print_date_time();
     674printf("Services already declared Warning server\n");
     675*/
     676                warn_server(conn_id);
    553677        }
    554678        if(update_did)
     
    559683                {
    560684                        dim_print_date_time();
    561                         printf( " Conn %3d : Server %s@%s (PID %d) registered %d services\n",
     685                        printf("Conn %3d : Server %s@%s (PID %d) registered %d services\n",
    562686                                conn_id, Dns_conns[conn_id].task_name,
    563687                                Dns_conns[conn_id].node_name,
     
    620744                {
    621745                        dim_print_date_time();
    622                         printf(" Server %s (%s@%s) has been set in error\n",
     746                        printf("Server %s (%s@%s) has been set in error\n",
    623747                                Dns_conns[conn_id].task_name, Net_conns[conn_id].task, Net_conns[conn_id].node);
    624748                        fflush(stdout);
     
    639763                {
    640764                        dim_print_date_time();
    641                         printf(" Conn %3d : Server %s@%s Registration Requested\n",
     765                        printf("Conn %3d : Server %s@%s Registration Requested\n",
    642766                                conn_id, Net_conns[conn_id].task, Net_conns[conn_id].node);
    643767                        fflush(stdout);
     
    647771                {
    648772                        dim_print_date_time();
    649                         printf(" Server Validity: Couldn't write, releasing Conn %3d : Server %s@%s\n",conn_id,
     773                        printf("Server Validity: Couldn't write, releasing Conn %3d : Server %s@%s\n",conn_id,
    650774                                Net_conns[conn_id].task, Net_conns[conn_id].node);
    651775                        fflush(stdout);
     
    676800        {
    677801                dim_print_date_time();
    678                 printf(" Conn %3d : Client %s@%s requested %s\n",
     802                printf("Conn %3d : Client %s@%s requested %s\n",
    679803                        conn_id, Net_conns[conn_id].task, Net_conns[conn_id].node,
    680804                        serv_regp->service_name);
     
    720844                        dic_packet.size = htovl(DNS_DIC_HEADER);
    721845                        dim_print_date_time();
    722                         printf(" Connection from %s refused, stopping client pid=%s\n",
     846                        printf("Connection from %s refused, stopping client pid=%s\n",
    723847                                        Net_conns[conn_id].node,
    724848                                        Net_conns[conn_id].task);
     
    727851                        {
    728852                                dim_print_date_time();
    729                                 printf(" Stop Client: Couldn't write, releasing Conn %3d : Client %s@%s\n",conn_id,
     853                                printf("Stop Client: Couldn't write, releasing Conn %3d : Client %s@%s\n",conn_id,
    730854                                        Net_conns[conn_id].task,
    731855                                        Net_conns[conn_id].node);
     
    773897                                }
    774898                                service_remove(&(servp->next));
    775                                 Curr_n_services--;
    776899                                free(servp);
    777900                        }
     
    815938                                }
    816939                                service_remove(&(servp->next));
    817                                 Curr_n_services--;
    818940                                free(servp);
    819941                        }
     
    850972                servp->conn_id = 0;
    851973                service_insert(&(servp->next));
    852                 Curr_n_services++;
    853974                servp->node_head = (RED_NODE *)malloc(sizeof(NODE));
    854975                dll_init( (DLL *) servp->node_head );
     
    9301051        {
    9311052                dim_print_date_time();
    932                 printf(" Client Request: Couldn't write, releasing Conn %3d : Client %s@%s\n",conn_id,
     1053                printf("Client Request: Couldn't write, releasing Conn %3d : Client %s@%s\n",conn_id,
    9331054                                        Net_conns[conn_id].task,
    9341055                                        Net_conns[conn_id].node);
     
    9621083                                (DLL *) servp)) )
    9631084        {
     1085/* DUPL
    9641086                if( servp->state != -1 )
     1087*/
     1088                if( servp->state > -1 )
    9651089                {
    9661090                        if( !dll_empty((DLL *) servp->node_head))
     
    10141138                {
    10151139                        dim_print_date_time();
    1016                         printf(" Inform Client: Couldn't write, releasing Conn %3d : Client %s@%s\n",nodep->conn_id,
     1140                        printf("Inform Client: Couldn't write, releasing Conn %3d : Client %s@%s\n",nodep->conn_id,
    10171141                                        Net_conns[nodep->conn_id].task,
    10181142                                        Net_conns[nodep->conn_id].node);
     
    10631187                                        {
    10641188                                                dim_print_date_time();
    1065                                                 printf(" Releasing client on conn %d - %s@%s\n",
     1189                                                printf("Releasing client on conn %d - %s@%s\n",
    10661190                                                        i, Net_conns[i].task, Net_conns[i].node);
    10671191                                                fflush(stdout);
     
    10881212                {
    10891213                        dim_print_date_time();
    1090                         printf( " Conn %3d : Server %s@%s died\n",
     1214                        printf("Conn %3d : Server %s@%s died\n",
    10911215                                conn_id, Dns_conns[conn_id].task_name,
    10921216                                Dns_conns[conn_id].node_name);
     
    10981222                        {
    10991223                                dim_print_date_time();
    1100                                 printf( " Conn %3d : Server %s@%s died\n",
     1224                                printf("Conn %3d : Server %s@%s died\n",
    11011225                                        conn_id, Dns_conns[conn_id].task_name,
    11021226                                        Dns_conns[conn_id].node_name);
     
    11191243                        {
    11201244                                service_remove(&(servp->next));
    1121                                 Curr_n_services--;
    11221245                                old_servp = servp;
    11231246                                servp = servp->server_prev;
     
    11521275                {
    11531276                        dim_print_date_time();
    1154                         printf(" Conn %3d : Client %s@%s died\n",
     1277                        printf("Conn %3d : Client %s@%s died\n",
    11551278                                conn_id, Net_conns[conn_id].task, Net_conns[conn_id].node);
    11561279                        fflush(stdout);
     
    11721295                                {
    11731296                                        service_remove(&(servp->next));
    1174                                         Curr_n_services--;
    11751297                                        free( servp );
    11761298                                }
     
    11871309                {
    11881310                        dim_print_date_time();
    1189                         printf(" Conn %3d : Undefined Type %s@%s died\n",
     1311                        printf("Conn %3d : Undefined Type %s@%s died\n",
    11901312                                conn_id, Net_conns[conn_id].task,
    11911313                                Net_conns[conn_id].node);
     
    12811403                                                    (DLL *) servp)) )
    12821404        {
     1405                if(servp->state == -2)
     1406                        continue;
    12831407                strncpy(dns_service_info->name, servp->serv_name, (size_t)MAX_NAME);
    12841408                dns_service_info->status = htovl(1);
     
    14481572        get_node_name(node);
    14491573        dim_print_date_time();
    1450         printf(" DNS version %d starting up on %s\n",DIM_VERSION_NUMBER, node);
     1574        printf("DNS version %d starting up on %s\n",DIM_VERSION_NUMBER, node);
    14511575        fflush(stdout);
    14521576
     
    15061630
    15071631        dim_print_date_time();
    1508         printf(" Connection Statistics :\n");
     1632        printf("Connection Statistics :\n");
    15091633        for(i = 0; i< Curr_N_Conns; i++)
    15101634        {
     
    15951719                                type |= (soft_code << (int)16) & (int)0xFFFF0000;
    15961720                                dim_print_date_time();
    1597                                 printf(" Killing server %s@%s with exit code %d\n",
     1721                                printf("Killing server %s@%s with exit code %d\n",
    15981722                                        Dns_conns[i].task_name, Dns_conns[i].node_name, soft_code);
    15991723                        }
     
    16011725                        {
    16021726                                dim_print_date_time();
    1603                                 printf(" Killing server %s@%s\n",
     1727                                printf("Killing server %s@%s\n",
    16041728                                        Dns_conns[i].task_name, Dns_conns[i].node_name);
    16051729                        }
     
    16091733                        {
    16101734                                dim_print_date_time();
    1611                                 printf(" Kill Server: Couldn't write, releasing %d\n",i);
     1735                                printf("Kill Server: Couldn't write, releasing %d\n",i);
    16121736                                fflush(stdout);
    16131737                                release_conn(i);
     
    16361760        dll_insert_queue((DLL *) Service_hash_table[index],
    16371761                         (DLL *) servp);
     1762        Curr_n_services++;
    16381763}
    16391764
     
    16421767{
    16431768        if( servp->node_head )
     1769        {
    16441770                free( servp->node_head );
    1645         dll_remove( (DLL *) servp );
     1771        }
     1772        if(servp->next)
     1773        {
     1774                dll_remove( (DLL *) servp );
     1775                Curr_n_services--;
     1776        }
    16461777}
    16471778
     
    18341965                dim_print_date_time();
    18351966                conn_id = dis_get_conn_id();
    1836                 printf(" Got Browse Request <%s> from conn: %d %s@%s\n", buffer, conn_id,
     1967                printf("Got Browse Request <%s> from conn: %d %s@%s\n", buffer, conn_id,
    18371968                        Net_conns[conn_id].task,Net_conns[conn_id].node);
    18381969        }
     
    18421973                dim_print_date_time();
    18431974                conn_id = dis_get_conn_id();
    1844                 printf(" Browse Request <%s> found %d services\n", buffer, n);
     1975                printf("Browse Request <%s> found %d services\n", buffer, n);
    18451976        }
    18461977        if(!Rpc_info_size)
  • trunk/FACT++/dim/src/examples/test_server.c

    r15282 r18920  
    6767        char aux[80];
    6868        char name[84]/*, name1[132]*/;
     69        char srvname[64];
    6970/*
    7071        int on = 0;
     
    9394        printf("result = %d\n", status);
    9495*/
     96        dim_print_date_time();
     97        printf("Dim Server Starting up...\n");
     98        fflush(stdout);
    9599        if(argc){}
    96100        new_dns = dim_get_env_var("EXTRA_DNS_NODE", extra_dns, sizeof(extra_dns));
     
    107111        dis_add_client_exit_handler(client_exited);
    108112
     113        strcpy(srvname, argv[1]);
     114        if(!strcmp(srvname,"xx1"))
     115                strcpy(srvname,"xx");
    109116        for(i = 0; i< 10; i++)
    110117        {
    111                 sprintf(str[i],"%s/Service_%03d",argv[1],i);
     118                sprintf(str[i],"%s/Service_%03d",srvname,i);
    112119                dis_add_service( str[i], "C", str[i], (int)strlen(str[i])+1,
    113120                        (void *)0, 0 );
     
    123130        strcpy(t.str,"hello world");
    124131
    125         sprintf(aux,"%s/TEST_SWAP",argv[1]);
     132        sprintf(aux,"%s/TEST_SWAP",srvname);
    126133        id = dis_add_service( aux, "l:3;d:1;s:1;c:1;s:1;f:1;c:20", &t, sizeof(t),
    127134                (void *)0, 0 );
     135        if(!strcmp(argv[1],"xx1"))
     136        {
     137                sprintf(aux,"%s/TEST_SWAP1",srvname);
     138                id = dis_add_service( aux, "l:3;d:1;s:1;c:1;s:1;f:1;c:20", &t, sizeof(t),
     139                        (void *)0, 0 );
     140        }
    128141        if(id){}
    129         sprintf(aux,"%s/TEST_CMD",argv[1]);
     142        sprintf(aux,"%s/TEST_CMD",srvname);
    130143        dis_add_cmnd(aux,"l:3;d:1;s:1;c:1;s:1;f:1;c:20",cmnd_rout, 0);
    131144
  • trunk/FACT++/dim/src/examples/test_server.cxx

    r18349 r18920  
    137137//      delete dim;
    138138
     139        dis_set_debug_on();
    139140        DimServer::start("TEST");
    140141        extraDns = DimUtil::getEnvVar((char *)"EXTRA_DNS_NODE");
    141142        if(extraDns)
    142                 newDns = new DimServerDns(extraDns, 0, (char *)"new_TEST");
     143                newDns = new DimServerDns(extraDns, 0, (char *)"TEST");
     144//              newDns = new DimServerDns(extraDns, 0, (char *)"new_TEST");
    143145
    144146//      int i, arr[15000];
     
    156158        if(extraDns)
    157159        {
    158                 new_servint = new DimService(newDns, "new_TEST/INTVAL",ival);
     160//              new_servint = new DimService(newDns, "new_TEST/INTVAL",ival);
     161                new_servint = new DimService(newDns, "TEST/new_INTVAL",ival);
    159162        }
    160163
  • trunk/FACT++/dim/src/tcpip.c

    r18097 r18920  
    1616#ifdef WIN32
    1717#define FD_SETSIZE      16384
    18 #define poll(pfd,nfds,timeout)  WSAPoll(pfd,nfds,timeout)
     18#endif
     19
     20#include <stdio.h>
     21#include <time.h>
     22#define DIMLIB
     23#include <dim.h>
     24
     25#ifdef WIN32
     26//#define poll(pfd,nfds,timeout)        WSAPoll(pfd,nfds,timeout)
    1927#define ioctl ioctlsocket
    2028
     
    2634#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
    2735#define EWOULDBLOCK WSAEWOULDBLOCK
     36#define EINPROGRESS WSAEINPROGRESS
    2837#define ECONNREFUSED WSAECONNREFUSED
     38#define ETIMEDOUT WSAETIMEDOUT
    2939#define HOST_NOT_FOUND  WSAHOST_NOT_FOUND
    3040#define NO_DATA WSANO_DATA
     
    8090#define MY_FD_ISSET(fd, set)    FD_ISSET(fd, set)
    8191#endif
    82 
    83 #include <stdio.h>
    84 #include <time.h>
    85 #define DIMLIB
    86 #include <dim.h>
    8792
    8893#define ushort unsigned short
     
    813818    fd_set      rfds;
    814819    int conn_id, ret, selret, count;
     820#ifndef __linux__
    815821        struct timeval  timeout;
     822#endif
    816823
    817824        if(num){}
    818825        do
    819826        {
    820                 timeout.tv_sec = 0;             /* Don't wait, just poll */
    821                 timeout.tv_usec = 0;
    822827                list_to_fds( &rfds );
    823828#ifdef __linux__
    824829                selret = poll(Pollfds, Pollfd_size, 0);
    825830#else
     831                timeout.tv_sec = 0;             /* Don't wait, just poll */
     832                timeout.tv_usec = 0;
    826833                selret = select(FD_SETSIZE, &rfds, NULL, NULL, &timeout);
    827834#endif
     
    890897#endif
    891898                if(ret <= 0)
    892                   {
    893                     printf("poll returned %d, errno %d\n", ret, errno);
    894                   }
     899                {
     900                    printf("poll/select returned %d, errno %d\n", ret, errno);
     901                }
    895902                if(ret > 0)
    896903                {
     
    10231030        int host_addr;
    10241031#endif
    1025         int path, val, ret_code, ret;
     1032        int path, val, ret_code, ret, retcon, selret;
    10261033        int a,b,c,d;
    10271034/* Fix for gcc 4.6 "dereferencing type-punned pointer will break strict-aliasing rules"?!*/
     
    10291036        unsigned char *ipaddr = ipaddr_buff;
    10301037        int host_number = 0;
     1038        int tcpip_would_block();
     1039#ifdef __linux__
     1040        struct pollfd pollitem;
     1041#else
     1042        struct timeval  timeout;
     1043        fd_set rfds, wfds, efds;
     1044#endif
     1045        int so_error = ETIMEDOUT;
     1046        int so_error_len = sizeof(so_error);
    10311047
    10321048    dim_tcpip_init(0);
     
    11611177#endif
    11621178        sockname.sin_port = htons((ushort) port); /* port number to send to */
    1163         while((ret = connect(path, (struct sockaddr*)&sockname, sizeof(sockname))) == -1 )
    1164         {
    1165                 if(errno != EINTR)
     1179        /*
     1180        while ((ret = connect(path, (struct sockaddr*)&sockname, sizeof(sockname))) == -1)
     1181        {
     1182                if (errno != EINTR)
    11661183                {
    11671184                        closesock(path);
     
    11691186                }
    11701187        }
    1171         strcpy( Net_conns[conn_id].node, node );
     1188        */
     1189        set_non_blocking(path);
     1190        retcon = connect(path, (struct sockaddr*)&sockname, sizeof(sockname));
     1191#ifndef WIN32
     1192        ret = errno;
     1193#else
     1194        ret = WSAGetLastError();
     1195#endif
     1196        set_blocking(path);
     1197        if (retcon == -1)
     1198        {
     1199                if (tcpip_would_block(ret))
     1200                {
     1201#ifdef __linux__
     1202                        pollitem.fd = path;
     1203                        pollitem.events = POLLIN | POLLOUT | POLLERR;
     1204                        pollitem.revents = 0;
     1205                        selret = poll(&pollitem, 1, CONNECT_TMOUT * 1000);
     1206#else
     1207                        timeout.tv_sec = CONNECT_TMOUT;
     1208                        timeout.tv_usec = 0;
     1209                        FD_ZERO(&wfds);
     1210                        FD_SET(path, &wfds);
     1211                        FD_ZERO(&rfds);
     1212                        FD_SET(path, &rfds);
     1213                        FD_ZERO(&efds);
     1214                        FD_SET(path, &efds);
     1215                        selret = select(FD_SETSIZE, &rfds, &wfds, &efds, &timeout);
     1216#endif
     1217                        if (selret > 0)
     1218                        {
     1219                                getsockopt(path, SOL_SOCKET, SO_ERROR, (void *)&so_error, &so_error_len);
     1220                        }
     1221                }
     1222                if (so_error != 0)
     1223                {
     1224#ifndef WIN32
     1225                        errno = so_error;
     1226#else
     1227                        WSASetLastError(so_error);
     1228#endif
     1229                        closesock(path);
     1230                        return(0);
     1231                }
     1232        }
     1233        strcpy(Net_conns[conn_id].node, node);
    11721234        strcpy( Net_conns[conn_id].task, task );
    11731235        Net_conns[conn_id].channel = path;
     
    15471609   if(code == EWOULDBLOCK)
    15481610                return(1);
    1549     return(0);
     1611   else if (code == EINPROGRESS)
     1612           return(1);
     1613   return(0);
    15501614}
    15511615
  • trunk/FACT++/dim/src/utilities.c

    r15282 r18920  
    1919#define DIMLIB
    2020#include <dim.h>
     21
     22/*added by dietrich beck, GSI*/
     23#ifdef PHARLAP
     24#define getenv(x) getenv2(x)
     25char* getenv2(envname)
     26char* envname;
     27{
     28        char* buff;
     29        int ml;
     30
     31        buff = (char*)malloc(200);
     32        ml = GetEnvironmentVariable(envname, buff, 200);
     33
     34        if (ml == 0){
     35                buff = NULL;
     36        }
     37        return buff;
     38}
     39#endif
    2140
    2241int get_proc_name(char *proc_name)
  • trunk/FACT++/dim/src/webDid/webDid.c

    r18058 r18920  
    66#include <dis.h>
    77
    8 extern int WebDID_Debug;
     8int WebDID_Debug = 1;
     9int IsWebDID = 1;
    910
    1011typedef struct item{
    1112    struct item *next;
     13        int id;
     14        /* must be here */
     15        char *service_format_ptr;
    1216        DNS_SERVER_INFO server;
    1317        DNS_SERVICE_INFO *service_ptr;
     
    1620        int busy;
    1721        int isSMI;
     22//      char *servicelistp;
     23        char **service_format_ptrp;
    1824}SERVER;
    1925
     
    2733}NODE;
    2834NODE *Node_head = (NODE *)0;
     35
     36typedef struct req_ent {
     37        struct req_ent *next;
     38        struct req_ent *prev;
     39        int conn_id;
     40//      int service_id;
     41//      int req_id;
     42//      int type;
     43//      struct serv *service_ptr;
     44        int timeout;
     45//      int format;
     46//      int first_time;
     47//      int delay_delete;
     48//      int to_delete;
     49        TIMR_ENT *timr_ent;
     50        void *nolink;
     51        int nolinksize;
     52        struct reqp_ent *reqpp;
     53        struct sitem *servicep;
     54} REQUEST;
     55
     56typedef struct reqp_ent {
     57        struct reqp_ent *next;
     58        struct reqp_ent *prev;
     59        REQUEST *reqp;
     60} REQUEST_PTR;
    2961
    3062typedef struct sitem{
     
    4375        time_t last_updated;
    4476        int n_browsers;
    45 }CURR_SERVICE;
    46 CURR_SERVICE *Curr_service_head = (CURR_SERVICE *)0;
     77        int formatted;
     78//      void *nolink;
     79//      int nolinksize;
     80        REQUEST *request_head;
     81        int is_nolink;
     82}SERVICE;
     83SERVICE *Curr_service_head = (SERVICE *)0;
    4784
    4885typedef struct objstate{
     
    6299    struct bitem *next;
    63100        int id;
     101        /* must be here */
     102        char *service_format_ptr;
    64103        int subscribe;
    65104        time_t last_subscribed;
     
    71110        int n_servers;
    72111        int n_nodes;
    73         CURR_SERVICE *servicep;
     112        SERVICE *servicep;
    74113        char *JSONBuffer;
    75114        int JSONBufferSize;
     
    78117        char pattern[256];
    79118        char curr_command[MAX_NAME];
    80         char *service_format_ptr;
     119//      char *service_format_ptr;
    81120        int isSMI;
    82121        int n_domains;
     
    85124        int curr_smidomain_nobjs;
    86125        OBJSTATE *smidomainp;
     126        int formatted;
     127        REQUEST_PTR *requestp_head;
    87128}BROWSER;
    88129BROWSER *Browser_head = (BROWSER *)0;
     
    106147int N_services = 0;     
    107148static char no_link = -1;
    108 static char no_link_str[5] = "DEAD";
     149//static char no_link_str[5] = "DEAD";
     150static char no_link_str[26] = "__DIM_SERVICE_NOT_THERE__";
    109151int no_link_int = -1;
    110152FILE    *fptr;
     
    147189        }
    148190        sprintf(icon_title,"DID %s",dns_node);
    149 dim_print_date_time();
    150 printf("webDid Starting up on %s\n\t serving %s\n", local_node, Title);
     191        if (IsWebDID)
     192        {
     193                dim_print_date_time();
     194                printf("webDid Starting up on %s\n\t serving %s\n", local_node, Title);
     195        }
     196        else
     197        {
     198                dim_print_date_time();
     199                printf("webDim Starting up on %s\n\t serving %s\n", local_node, Title);
     200        }
    151201        Timer_q = dtq_create();
    152         dic_info_service("DIS_DNS/SERVER_INFO",MONITORED,0,0,0,update_servers,0,
     202        dic_info_service((const char *)"DIS_DNS/SERVER_INFO",MONITORED,0,0,0,(void (*)(int *,void *,int *))update_servers,0,
    153203                                                &no_link,1);
    154204        return 1;
     
    187237}
    188238
    189 int find_server_service_pattern(SERVER *servp, char *pattern)
     239int find_server_service_pattern(SERVER *servp, char *pattern, char **bufptr)
    190240{
    191241        DNS_SERVICE_INFO *servicep;
    192242        int n_services, i;
    193243        int n_found = 0;
     244        char *ptr, str[256], *sptr, *sformat, *stype;
     245        int type, index;
     246        char *addJSONChildStart();
     247        char *addJSONChildEnd();
     248        int doall = 0, doit = 0;
    194249
    195250        servicep = servp->service_ptr;
    196251        n_services = servp->server.n_services;
    197         for(i = 0; i < n_services; i++)
    198         {
    199                 if(strstr(servicep->name, pattern))
     252        if (!strcmp(pattern, "*"))
     253        {
     254                doall = 1;
     255        }
     256        for (i = 0; i < n_services; i++)
     257        {
     258                sptr = (char *)servp->service_format_ptrp[i];
     259                if (!sptr)
     260                        break;
     261                if (!doall)
     262                {
     263                        doit = 0;
     264//                      if (strstr(servicep->name, pattern))
     265//                      if (sptr)
     266//                      {
     267//                              if (strstr(servicep->name, pattern))
     268                                if (strstr(sptr, pattern))
     269                                {
     270                                        doit = 1;
     271                                }
     272//                      }
     273                }
     274                if (doall || doit)
    200275                {
    201276                        n_found++;
     277                        if(bufptr)
     278                        {
     279/*
     280                                type = servicep->type;
     281                                if (type < 0xff)
     282                                        printf("problem %s %d", servicep->name, servicep->type);
     283                                index = type;
     284                                type &= 0x000000FF;
     285                                index = (index >> 16) & 0xFFFF;
     286                                index--;
     287                                sptr = (char *)servp->service_format_ptrp[index];
     288                                ptr = *bufptr;
     289                                sprintf(str, "name: \"%s\", format: \"%s\", type: %d", servicep->name,
     290                    (char *)sptr + strlen((const char *)sptr)+1, type);
     291*/
     292                                ptr = *bufptr;
     293                                sformat = (char *)sptr + strlen((const char *)sptr) + 1;
     294                                stype = (char *)sformat + strlen((const char *)sformat) + 1;
     295                                if (*stype = '\n')
     296                                        type = 0;
     297                                else if (*stype == 'C')
     298                                        type = 1;
     299                                else if (*stype == 'R')
     300                                        type = 2;
     301                                sprintf(str, "name: \"%s\", format: \"%s\", type: %d", sptr, sformat, type);
     302                                ptr = addJSONChildStart(ptr, str, 0);
     303                                ptr = addJSONChildEnd(ptr, 1);
     304                                *bufptr = ptr;
     305                        }
    202306                }
    203307                servicep++;
     
    206310}
    207311
    208 int find_service_pattern(NODE *nodep, SERVER *servpp, char *pattern, int *n_servers)
     312int find_service_pattern(NODE *nodep, SERVER *servpp, char *pattern, int *n_servers, char **ptr)
    209313{
    210314  SERVER *servp;
     
    217321        while( (servp = (SERVER *)sll_get_next((SLL *)servp)) )
    218322        {
    219                 if((ret = find_server_service_pattern(servp, pattern)))
     323                if((ret = find_server_service_pattern(servp, pattern, ptr)))
    220324                {
    221325                        n_found += ret;
     
    226330  else
    227331  {
    228         if((ret = find_server_service_pattern(servpp, pattern)))
     332        if((ret = find_server_service_pattern(servpp, pattern, ptr)))
    229333        {
    230334                n_found += ret;
     
    236340}
    237341
    238 CURR_SERVICE *find_curr_service(char *service)
    239 {
    240   CURR_SERVICE *servicep;
     342SERVICE *find_curr_service(char *service)
     343{
     344  SERVICE *servicep;
    241345
    242346  servicep = Curr_service_head ;
    243   while( (servicep = (CURR_SERVICE *)sll_get_next((SLL *)servicep)) )
     347  while( (servicep = (SERVICE *)sll_get_next((SLL *)servicep)) )
    244348  {
    245349      if(!strcmp(servicep->name,service))
     
    248352          }
    249353  }
    250   return ((CURR_SERVICE *)0);
     354  return ((SERVICE *)0);
    251355}
    252356
     
    285389{
    286390  BROWSER *browserp;
    287   int prepareJSONTree();
     391  int prepareJSONTree(char *, BROWSER *);
    288392
    289393  browserp = Browser_head;
     
    291395  {
    292396          if(browserp->pattern[0] != '\0')
    293                   prepareJSONTree(browserp);
     397                  prepareJSONTree("",browserp);
    294398  }
    295399}
     
    311415int prepareJSONTree();
    312416int prepareJSONHeader();
     417void got_update_services();
    313418
    314419        if(tag){}
     
    379484                        strcpy(servp->name,sname);
    380485                        servp->next = 0;
     486                        servp->id = 0;
    381487                        servp->busy = 0;
    382488                        servp->server.n_services = 0;
    383489                        servp->service_ptr = 0;
     490                        servp->service_format_ptr = 0;
     491                        servp->service_format_ptrp = 0;
    384492                        servp->isSMI = 0;
    385493                        if(strstr(sname,"_SMI"))
     
    407515                        servp->service_ptr = 0;
    408516                }
    409                 if(n_services != -1)
     517                if (servp->service_format_ptr)
     518                {
     519                        free(servp->service_format_ptr);
     520                        servp->service_format_ptr = 0;
     521                }
     522                if (servp->service_format_ptrp)
     523                {
     524                        free(servp->service_format_ptrp);
     525                        servp->service_format_ptrp = 0;
     526                }
     527                if (n_services != -1)
    410528                {
    411529                        service_size = n_services*(int)sizeof(DNS_SERVICE_INFO);
     
    413531                        memcpy(servp->service_ptr, buffer->services, (size_t)service_size);
    414532                        N_services += n_services;
     533                        sprintf(str, "%s/SERVICE_LIST", sname);
     534//                      printf("subscribe update_servers %s %d\n", sname, n_services);
     535                        dic_info_service(str, ONCE_ONLY, 20, 0, 0,
     536                                got_update_services, (dim_long)servp, "None", 5);
    415537                }
    416538                servp->busy = 1;
     
    419541        {
    420542          if(servp)
    421             {
     543          {
    422544                N_servers--;
    423545                if(servp->server.n_services != -1)
    424                   {
    425                         N_services -= servp->server.n_services;
    426                   }
     546                {
     547                    N_services -= servp->server.n_services;
     548                }
    427549                servp->server.n_services = 0;
    428550                servp->busy = -1;
    429551                servp->isSMI = 0;
    430             }
     552          }
    431553        }
    432554        if(JSONHeader[0])
    433555          prepareJSONHeader();
     556//      printf("update_servers %d %d %d\n", N_nodes, N_servers, N_services);
    434557}
    435558
     
    437560{
    438561        BROWSER *browserp;
     562        SERVER *servp;
     563        DNS_SERVICE_INFO *servicep;
     564        int i, j, n_services, index = 0, type;
     565        char *ptr, *ptre, *ptr1, tmp[MAX_NAME], *sptr;
    439566
    440567        if(size){}
    441568        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);
     569        if (browserp)
     570        {
     571                if (browserp->service_format_ptr)
     572                        free(browserp->service_format_ptr);
     573                browserp->service_format_ptr = (char *)malloc(strlen(buffer) + 1);
     574                strcpy(browserp->service_format_ptr, buffer);
     575        }
     576        if (browserp->id == 0)
     577        {
     578                servp = (SERVER *)browserp;
     579                n_services = servp->server.n_services;
     580                if (servp->service_format_ptrp)
     581                        free(servp->service_format_ptrp);
     582                servp->service_format_ptrp = (char **)malloc(n_services*sizeof(char *));
     583                memset(servp->service_format_ptrp, 0, (size_t)n_services*sizeof(char *));
     584                ptr = servp->service_format_ptr;
     585                servicep = servp->service_ptr;
     586                for (i = 0; i < n_services; i++)
     587                {
     588                        servicep->type &= 0x000000FF;
     589                        servicep++;
     590                        servp->service_format_ptrp[index++] = ptr;
     591                        ptre = strchr(ptr, '\n');
     592                        ptr1 = strchr(ptr, '|');
     593                        if(ptr1)
     594                        {
     595                                *ptr1 = '\0';
     596                                ptr1++;
     597                                ptr1 = strchr(ptr1, '|');
     598                                if (ptr1)
     599                                        *ptr1 = '\0';
     600                        }
     601                        ptr = ptre;
     602                        if (!ptr)
     603                        {
     604                                break;
     605                                if (!(*ptr))
     606                                        break;
     607                        }
     608                        ptr++;
     609                        if (!(*ptr))
     610                                break;
     611                }
     612/*
     613                for (i = 0; i < n_services; i++)
     614                {
     615                        if (!servp->service_format_ptrp[i])
     616                                break;
     617                        servicep = servp->service_ptr;
     618                        for (j = 0; j < n_services; j++)
     619                        {
     620                                if (servicep->type < 0xFF)
     621                                {
     622                                        if ((strstr(servicep->name, "/RpcIn")) || (strstr(servicep->name, "/RpcOut")))
     623                                        {
     624                                                strcpy(tmp, servicep->name);
     625                                                if ((ptr = strstr(tmp, "/RpcIn")))
     626                                                        *ptr = '\0';
     627                                                if ((ptr = strstr(tmp, "/RpcOut")))
     628                                                        *ptr = '\0';
     629                                                if (!strcmp(tmp, servp->service_format_ptrp[i]))
     630                                                {
     631                                                        servicep->type |= ((i + 1) << 16);
     632                                                        break;
     633                                                }
     634                                        }
     635                                        if (!strcmp(servicep->name, servp->service_format_ptrp[i]))
     636                                        {
     637                                                servicep->type |= ((i+1) << 16);
     638                                                break;
     639                                        }
     640                                }
     641//                              printf("%s %08x\n",servicep->name, servicep->type);
     642//                              if (servicep->type == 0)
     643//                                      break;
     644                                servicep++;
     645                        }
     646                }
     647*/
     648/*
     649                servicep = servp->service_ptr;
     650                for (i = 0; i < n_services; i++)
     651                {
     652                        for (j = 0; j < n_services; j++)
     653                        {
     654                                if (!servp->service_format_ptrp[j])
     655                                        break;
     656                                if ((strstr(servicep->name, "/RpcIn")) || (strstr(servicep->name, "/RpcOut")))
     657                                {
     658                                        strcpy(tmp, servicep->name);
     659                                        if ((ptr = strstr(tmp, "/RpcIn")))
     660                                                *ptr = '\0';
     661                                        if ((ptr = strstr(tmp, "/RpcOut")))
     662                                                *ptr = '\0';
     663                                        if (!strcmp(tmp, servp->service_format_ptrp[j]))
     664                                        {
     665                                                servicep->type |= ((j + 1) << 16);
     666                                                break;
     667                                        }
     668                                }
     669                                if (!strcmp(servicep->name, servp->service_format_ptrp[j]))
     670                                {
     671                                        servicep->type |= ((j + 1) << 16);
     672                                        break;
     673                                }
     674                        }
     675                                //                              if (servicep->type == 0)
     676                                //                                      break;
     677                        type = servicep->type;
     678                        index = type;
     679                        type &= 0x000000FF;
     680                        index = (index >> 16) & 0xFFFF;
     681                        index--;
     682                        sptr = (char *)servp->service_format_ptrp[index];
     683                        printf("%s %08x %s\n", servicep->name, servicep->type, (char *)sptr + strlen((const char *)sptr) + 1);
     684                        servicep++;
     685                }
     686*/
     687        }
     688//      printf("got_update_services %s\n", buffer);
    446689}
    447690
     
    454697        BROWSER *browserp;
    455698        char *prepareJSONServiceList();
    456         BROWSER *create_browser();
     699        BROWSER *create_browser(int);
    457700
    458701        if(!(browserp = find_browser(browser)))
     
    610853}
    611854
    612 int delete_curr_service(CURR_SERVICE *servicep)
     855int delete_curr_service(SERVICE *servicep)
    613856{
    614857
     
    620863        if(servicep->buffer_str_size)
    621864                free(servicep->buffer_str);
     865//      if (servicep->nolink)
     866//              free(servicep->nolink);
    622867        sll_remove((SLL *)Curr_service_head, (SLL *)servicep);
    623868        free(servicep);
     
    625870}
    626871
     872int close_browser(int browser)
     873{
     874        BROWSER *browserp;
     875
     876        if ((browserp = find_browser(browser)))
     877                delete_browser(browserp);
     878        return 1;
     879}
    627880int delete_browser(BROWSER *browserp)
    628881{
    629         CURR_SERVICE *servicep;
    630 
     882        SERVICE *servicep;
     883        int i;
     884
     885        release_all_requests(browserp);
     886        if (browserp->requestp_head)
     887                free(browserp->requestp_head);
     888        /*
    631889        if((servicep = browserp->servicep))
    632890        {
     
    635893                        delete_curr_service(servicep);
    636894        }
     895*/
    637896        if(browserp->service_format_ptr)
    638897                free(browserp->service_format_ptr);
     
    679938        browserp->n_servers = 0;
    680939        browserp->n_services = 0;
    681         browserp->servicep = 0;
     940//      browserp->servicep = 0;
    682941        browserp->JSONBuffer = 0;
    683942        browserp->JSONBufferSize = 0;
     
    689948        browserp->curr_smidomain[0] = '\0';
    690949        browserp->smidomainp = 0;
    691         sll_insert_queue((SLL *)Browser_head,(SLL *)browserp);
    692         dtq_start_timer(10, check_browser, browserp);
     950        browserp->requestp_head = (REQUEST_PTR *)malloc(sizeof(REQUEST_PTR));
     951        dll_init((DLL *)(browserp->requestp_head));
     952        sll_insert_queue((SLL *)Browser_head, (SLL *)browserp);
     953        if(IsWebDID)
     954            dtq_start_timer(10, check_browser, browserp);
    693955        return browserp;
    694956}
     
    716978}
    717979
    718 int update_service_data(char *service, int conn_id, int subscribe, int req, int browser, int force)
    719 {
    720         CURR_SERVICE *servicep;
     980REQUEST *create_request(int conn_id, SERVICE *servicep, int timeout, void *nolink, int nolinksize)
     981{
     982        REQUEST *newp;
     983
     984        newp = (REQUEST *)malloc(sizeof(REQUEST));
     985        newp->servicep = servicep;
     986        newp->timeout = timeout;
     987        newp->conn_id = conn_id;
     988//      newp->first_time = 1;
     989//      newp->delay_delete = 0;
     990//      newp->to_delete = 0;
     991        newp->timr_ent = 0;
     992        newp->reqpp = 0;
     993        newp->nolink = 0;
     994        newp->nolinksize = 0;
     995        if (nolinksize)
     996        {
     997                newp->nolink = malloc(nolinksize);
     998                newp->nolinksize = nolinksize;
     999                memcpy(newp->nolink, nolink, nolinksize);
     1000        }
     1001        dll_insert_queue((DLL *)servicep->request_head, (DLL *)newp);
     1002        return newp;
     1003}
     1004
     1005REQUEST_PTR *create_requestp(REQUEST *reqp, BROWSER *browserp)
     1006{
     1007        REQUEST_PTR *reqpp;
     1008
     1009        reqpp = (REQUEST_PTR *)malloc(sizeof(REQUEST_PTR));
     1010        reqpp->reqp = reqp;
     1011        reqp->reqpp = reqpp;
     1012        dll_insert_queue((DLL *)browserp->requestp_head, (DLL *)reqpp);
     1013        return reqpp;
     1014}
     1015
     1016int release_request(REQUEST_PTR *reqpp)
     1017{
     1018        REQUEST *reqp;
     1019        SERVICE *servicep;
     1020
     1021        reqp = reqpp->reqp;
     1022        if (reqp)
     1023        {
     1024                servicep = reqp->servicep;
     1025                dll_remove((DLL *)reqp);
     1026        }
     1027        if (reqpp)
     1028                dll_remove((DLL *)reqpp);
     1029        if (reqp->nolink)
     1030                free(reqp->nolink);
     1031        //      if (reqp->timr_ent)
     1032//              dtq_rem_entry(Dis_timer_q, reqp->timr_ent);
     1033//      id_free(reqp->req_id, SRC_DIS);
     1034        servicep->n_browsers--;
     1035        if (dll_empty((DLL *)servicep->request_head))
     1036        {
     1037//              if (!servicep->n_browsers)
     1038//              {
     1039                        free(servicep->request_head);
     1040                        delete_curr_service(servicep);
     1041//              }
     1042        }
     1043        if (reqp)
     1044                free(reqp);
     1045        if (reqpp)
     1046                free(reqpp);
     1047        return 1;
     1048}
     1049
     1050int release_all_requests(BROWSER *browserp)
     1051{
     1052        REQUEST_PTR *reqpp, *auxp;
     1053        int release_request();
     1054
     1055        if (browserp)
     1056        {
     1057                reqpp = browserp->requestp_head;
     1058                while ((reqpp = (REQUEST_PTR *)dll_get_next((DLL *)browserp->requestp_head,
     1059                        (DLL *)reqpp)))
     1060                {
     1061                        auxp = reqpp->prev;
     1062                        release_request(reqpp);
     1063                        reqpp = auxp;
     1064                }
     1065        }
     1066        return 1;
     1067}
     1068
     1069REQUEST_PTR *find_request(SERVICE* servicep, int conn_id)
     1070{
     1071        REQUEST_PTR *reqpp;
     1072        REQUEST *reqp;
     1073
     1074        if (servicep)
     1075        {
     1076                reqp = servicep->request_head;
     1077                while ((reqp = (REQUEST *)dll_get_next((DLL *)servicep->request_head,
     1078                        (DLL *)reqp)))
     1079                {
     1080                        if (reqp->conn_id == conn_id)
     1081                                return reqp->reqpp;
     1082                }
     1083        }
     1084        return (REQUEST_PTR *)0;
     1085}
     1086
     1087int update_service_data(char *service, int conn_id, int subscribe, int req, int browser, int force,
     1088        int formatted, void *nolink, int nolinksize)
     1089{
     1090        SERVICE *servicep;
    7211091        time_t tsecs;
    7221092        void recv_service_info();
    7231093        extern void sendData();
    7241094        BROWSER *browserp;
     1095        int i;
     1096        REQUEST *reqp;
     1097        REQUEST_PTR *reqpp;
    7251098
    7261099        if(req){}
    7271100        if(!Curr_service_head)
    7281101        {
    729                 Curr_service_head = (CURR_SERVICE *)malloc(sizeof(CURR_SERVICE));
     1102                Curr_service_head = (SERVICE *)malloc(sizeof(SERVICE));
    7301103                sll_init((SLL *)Curr_service_head);
    7311104        }
     
    7371110                return 1;
    7381111        }
    739         if((servicep = browserp->servicep))
    740         {
    741                 servicep->n_browsers--;
    742                 if(!servicep->n_browsers)
    743                         delete_curr_service(servicep);
     1112        browserp->formatted = formatted;
     1113        if(IsWebDID)
     1114        {
     1115/*
     1116                if ((servicep = browserp->servicep))
     1117                {
     1118                        servicep->n_browsers--;
     1119                        if (!servicep->n_browsers)
     1120                                delete_curr_service(servicep);
     1121                }
     1122*/
     1123                release_all_requests(browserp);
     1124        }
     1125        if (subscribe == -2)
     1126        {
     1127                if ((servicep = find_curr_service(service)))
     1128                {
     1129                        reqpp = find_request(servicep, conn_id);
     1130                        if (reqpp)
     1131                            release_request(reqpp);
     1132                }
     1133                return 1;
    7441134        }
    7451135        if(!(servicep = find_curr_service(service)))
    7461136        {
    747                 servicep = (CURR_SERVICE *)malloc(sizeof(CURR_SERVICE));
     1137                servicep = (SERVICE *)malloc(sizeof(SERVICE));
    7481138                strcpy(servicep->name,service);
    7491139                servicep->conn_id = conn_id;
     
    7601150                servicep->last_subscribed = tsecs;
    7611151                servicep->n_browsers = 0;
     1152                servicep->formatted = formatted;
     1153                servicep->request_head = (REQUEST *)malloc(sizeof(REQUEST));
     1154                servicep->is_nolink = 0;
     1155                dll_init((DLL *)(servicep->request_head));
     1156                reqp = create_request(conn_id, servicep, subscribe, nolink, nolinksize);
     1157                reqpp = create_requestp(reqp, browserp);
    7621158                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);
     1159                servicep->sid = (int)dic_info_service_stamped(service, MONITORED, 0, 0, 0,
     1160                        recv_service_info, servicep, no_link_str, strlen(no_link_str));
    7651161        }
    7661162        else
     
    7681164                if(servicep->size)
    7691165                {
    770                         if((servicep->timestamp > browserp->last_updated) || (force))
    771                         {
    772                                 sendData(conn_id, servicep->buffer_str, 4);
     1166                        reqp = create_request(conn_id, servicep, subscribe, nolink, nolinksize);
     1167                        reqpp = create_requestp(reqp, browserp);
     1168                        if ((servicep->timestamp > browserp->last_updated) || (force))
     1169                        {
     1170                                if(browserp->formatted)
     1171                                        sendData(conn_id, servicep->buffer_str, 4);
     1172                                else
     1173                                {
     1174                                        if (servicep->is_nolink)
     1175                                                sendData(conn_id, reqp->nolink, 11);
     1176                                        else
     1177                                                sendData(conn_id, servicep->buffer, 11);
     1178//                                      sendData(conn_id, servicep->buffer, 11);
     1179                                }
    7731180                        }
    7741181                        else
    7751182                        {
    776                                 sendData(conn_id, "", 4);
     1183                sendData(conn_id, "", 4);
    7771184                        }
    7781185                        browserp->last_updated = servicep->timestamp;
     
    7811188        if(force)
    7821189        {
    783                 browserp->servicep = servicep;
     1190//              browserp->servicep = servicep;
    7841191                servicep->n_browsers++;
    7851192        }
     
    7891196int check_browser_changes(char *service, int conn_id, int subscribe, int req, int browser, int force)
    7901197{
    791         CURR_SERVICE *servicep;
     1198        SERVICE *servicep;
    7921199        time_t tsecs;
    7931200        void recv_service_info();
     
    8031210        if(!Curr_service_head)
    8041211        {
    805                 Curr_service_head = (CURR_SERVICE *)malloc(sizeof(CURR_SERVICE));
     1212                Curr_service_head = (SERVICE *)malloc(sizeof(SERVICE));
    8061213                sll_init((SLL *)Curr_service_head);
    8071214        }
     
    8731280        void print_service_formatted();
    8741281        extern void sendData();
    875         CURR_SERVICE *servicep;
     1282        SERVICE *servicep;
    8761283        time_t tsecs;
     1284        REQUEST *reqp, *auxp;
    8771285
    8781286        servicep = *tag;
     
    8971305        strcpy(Curr_service_name, servicep->name);
    8981306        get_curr_service_format();
    899         if((*size == 4 ) && (*buffer == -1))
    900         {
     1307//      if ((*size == servicep->nolinksize) && (!memcmp(buffer, servicep->nolink, servicep->nolinksize)))
     1308//      if ((*size == 4) && (*buffer == -1))
     1309        servicep->is_nolink = 0;
     1310        if ((*size == strlen(no_link_str)) && (!memcmp(buffer, no_link_str, strlen(no_link_str))))
     1311    {
     1312                servicep->is_nolink = 1;
    9011313                sprintf(Service_content_str,
    9021314                        "Service %s Not Available", Curr_service_name);
     
    9061318                print_service_formatted(servicep, buffer, *size);
    9071319        }
    908         if(servicep->last_updated == 0)
    909         {
    910                 sendData(conn_id, Service_content_str, 4);
     1320if(WebDID_Debug)
     1321        printf("service updated - %s,  conn_id %d\n", Curr_service_name, conn_id);
     1322
     1323    if (IsWebDID)
     1324    {
     1325            if (servicep->last_updated == 0)
     1326            {
     1327                    if (servicep->formatted)
     1328                            sendData(conn_id, Service_content_str, 4);
     1329                    else
     1330                            sendData(conn_id, servicep->buffer, 11);
     1331                    tsecs = time((time_t *)0);
     1332                    servicep->last_updated = tsecs;
     1333            }
     1334    }
     1335        else
     1336        {
    9111337                tsecs = time((time_t *)0);
    9121338                servicep->last_updated = tsecs;
    913         }
    914 }
    915 
    916 void print_service_formatted(CURR_SERVICE *servicep, void *buff, int size)
     1339                reqp = servicep->request_head;
     1340                while ((reqp = (REQUEST *)dll_get_next((DLL *)servicep->request_head,
     1341                        (DLL *)reqp)))
     1342                {
     1343/*
     1344                        if (servicep->buffer_size < reqp->nolinksize)
     1345                        {
     1346                                if (servicep->buffer_size)
     1347                                        free(servicep->buffer);
     1348                                servicep->buffer = malloc((size_t)reqp->nolinksize);
     1349                                servicep->buffer_size = reqp->nolinksize;
     1350                        }
     1351                        memcpy(servicep->buffer, (char *)reqp->nolink, (size_t)reqp->nolinksize);
     1352                        servicep->size = *size;
     1353*/
     1354                        if (servicep->is_nolink)
     1355                                sendData(reqp->conn_id, reqp->nolink, 11);
     1356                        else
     1357                        sendData(reqp->conn_id, servicep->buffer, 11);
     1358                        if (reqp->timeout == -1)
     1359                        {
     1360// May delete servicep...
     1361                                auxp = reqp->prev;
     1362                                release_request(reqp->reqpp);
     1363                                reqp = auxp;
     1364                        }
     1365                }
     1366        }
     1367}
     1368
     1369void print_service_formatted(SERVICE *servicep, void *buff, int size)
    9171370{
    9181371char type;
     
    14631916}
    14641917
     1918char *getJSONDimBuffer(char *node, int browser)
     1919{
     1920        BROWSER *browserp;
     1921        int prepareJSONDimTree();
     1922
     1923        if (browser)
     1924        {
     1925                if ((browserp = find_browser(browser)))
     1926                {
     1927                        if (browserp->pattern[0] != '\0')
     1928                        {
     1929                                prepareJSONDimTree(node, browserp);
     1930                                return(browserp->JSONBuffer);
     1931                        }
     1932                        browserp->n_services = 0;
     1933                        browserp->n_servers = 0;
     1934                        browserp->n_nodes = 0;
     1935                }
     1936        }
     1937        prepareJSONDimTree(node, 0);
     1938        return(JSONBuffer);
     1939}
     1940
    14651941char *getJSONHeader(int isSMI)
    14661942{
     
    15502026                if(selective)
    15512027                {
    1552                         if(!(ret = find_service_pattern(nodep, 0, browserp->pattern, &tot_n_servers)))
     2028                        if(!(ret = find_service_pattern(nodep, 0, browserp->pattern, &tot_n_servers, 0)))
    15532029                        {
    15542030                                nodep->match = 0;
     
    16092085                        if(selective)
    16102086                        {
    1611                                 if(!(ret = find_service_pattern(nodep, servp, browserp->pattern, 0)))
     2087                                if(!(ret = find_service_pattern(nodep, servp, browserp->pattern, 0, 0)))
    16122088                                {
    16132089                                        servp->match = 0;
     
    17142190                if(selective)
    17152191                {
    1716                         if(!(ret = find_service_pattern(nodep, 0, pattern, &tot_n_servers)))
     2192                        if(!(ret = find_service_pattern(nodep, 0, pattern, &tot_n_servers, 0)))
    17172193                        {
    17182194                                nodep->match = 0;
     
    17732249                        if(selective)
    17742250                        {
    1775                                 if(!(ret = find_service_pattern(nodep, servp, pattern, 0)))
     2251                                if(!(ret = find_service_pattern(nodep, servp, pattern, 0, 0)))
    17762252                                {
    17772253                                        servp->match = 0;
     
    18142290        */
    18152291printf("%s\n",browserp->JSONSmiBuffer);
     2292        return(1);
     2293}
     2294
     2295int prepareJSONDimTree(char *node, BROWSER *browserp)
     2296{
     2297        char *ptr;
     2298        NODE *nodep;
     2299        SERVER *servp;
     2300        char str[256], aux[128];
     2301        int selective = 0;
     2302        int n_nodes, tot_n_nodes;
     2303        int n_servers, tot_n_servers;
     2304        int ret, n_found = 0;
     2305
     2306        if (browserp)
     2307        {
     2308                if (browserp->pattern[0] != '\0')
     2309                        selective = 1;
     2310                else
     2311                        return(0);
     2312        }
     2313        if (!selective)
     2314        {
     2315                if (JSONBufferSize == 0)
     2316                {
     2317                        JSONBuffer = malloc((size_t)(N_nodes * 128 + N_servers * 128));
     2318                }
     2319                else if (JSONBufferSize < N_nodes * 128 + N_servers * 128)
     2320                {
     2321                        free(JSONBuffer);
     2322                        JSONBuffer = malloc((size_t)(N_nodes * 128 + N_servers * 128));
     2323                }
     2324                ptr = JSONBuffer;
     2325        }
     2326        else
     2327        {
     2328                if (browserp->JSONBufferSize == 0)
     2329                {
     2330                        browserp->JSONBuffer = malloc((size_t)(N_services * (128*2)));
     2331                }
     2332                else if (browserp->JSONBufferSize < (N_services * (128 * 2)))
     2333                {
     2334                        free(browserp->JSONBuffer);
     2335                        browserp->JSONBuffer = malloc((size_t)(N_services * (128 * 2)));
     2336                }
     2337                ptr = browserp->JSONBuffer;
     2338        }
     2339        *ptr = '\0';
     2340        if (!strcmp(node, "src"))
     2341        {
     2342                ptr = addJSONStart(ptr);
     2343                ptr = addJSONNodeStart(ptr, "services");
     2344//              sprintf(str, "text: \"%s\", id: \"Nodes\", expanded: false", Title);
     2345//              ptr = addJSONChildStart(ptr, str, 1);
     2346//              ptr = addJSONNodeStart(ptr, "children");
     2347                nodep = Node_head;
     2348                tot_n_nodes = 0;
     2349                while ((nodep = (NODE *)sll_get_next((SLL *)nodep)))
     2350                {
     2351//                      nodep->match = 1;
     2352                        if (selective)
     2353                        {
     2354                                if (!(ret = find_service_pattern(nodep, 0, browserp->pattern, &tot_n_servers, &ptr)))
     2355                                {
     2356//                                      nodep->match = 0;
     2357                                        continue;
     2358                                }
     2359                                else
     2360                                {
     2361                                        n_found += ret;
     2362                                }
     2363                        }
     2364                        tot_n_nodes++;
     2365                }
     2366                if(n_found)
     2367                {
     2368                        ptr--;
     2369                        *(ptr-1) = ' ';
     2370                }
     2371                /*
     2372                n_nodes = 0;
     2373                nodep = Node_head;
     2374                while ((nodep = (NODE *)sll_get_next((SLL *)nodep)))
     2375                {
     2376                        if (!nodep->match)
     2377                                continue;
     2378                        getNodeLabel(nodep->name, aux);
     2379                        sprintf(str, "text: \"%s\", id: \"%s\", qtip: \"%s\"",
     2380                                aux, nodep->name, nodep->name);
     2381                        ptr = addJSONChildStart(ptr, str, 0);
     2382                        n_nodes++;
     2383                        if (WebDID_Debug)
     2384                                printf("adding %s %d %d\n", nodep->name, n_nodes, tot_n_nodes);
     2385                        if (n_nodes < tot_n_nodes)
     2386                                ptr = addJSONChildEnd(ptr, 1);
     2387                        else
     2388                                ptr = addJSONChildEnd(ptr, 0);
     2389                }
     2390        */
     2391//              ptr = addJSONNodeEnd(ptr);
     2392//              ptr = addJSONChildEnd(ptr, 0);
     2393                ptr = addJSONNodeEnd(ptr);
     2394                ptr = addJSONEnd(ptr);
     2395                if (selective)
     2396                {
     2397                        browserp->n_services = n_found;
     2398                        browserp->n_servers = tot_n_servers;
     2399                        browserp->n_nodes = tot_n_nodes;
     2400                }
     2401        }
     2402        else
     2403        {
     2404                if ((nodep = find_node(node)))
     2405                {
     2406                        ptr = addJSONStart(ptr);
     2407                        ptr = addJSONNodeStart(ptr, "children");
     2408                        servp = nodep->server_head;
     2409                        tot_n_servers = 0;
     2410                        while ((servp = (SERVER *)sll_get_next((SLL *)servp)))
     2411                        {
     2412                                servp->match = 1;
     2413                                if (servp->busy != 1)
     2414                                {
     2415                                        servp->match = 0;
     2416                                        continue;
     2417                                }
     2418                                if (selective)
     2419                                {
     2420                                        if (!(ret = find_service_pattern(nodep, servp, browserp->pattern, 0, 0)))
     2421                                        {
     2422                                                servp->match = 0;
     2423                                                continue;
     2424                                        }
     2425                                        else
     2426                                        {
     2427                                                n_found += ret;
     2428                                        }
     2429                                }
     2430                                tot_n_servers++;
     2431                        }
     2432                        n_servers = 0;
     2433                        servp = nodep->server_head;
     2434                        while ((servp = (SERVER *)sll_get_next((SLL *)servp)))
     2435                        {
     2436                                if (!servp->match)
     2437                                        continue;
     2438                                sprintf(str, "text: \"%s\", id: \"%d\", leaf: true, icon: \"server.png\"", servp->name, servp->server.pid);
     2439                                ptr = addJSONChildStart(ptr, str, 0);
     2440                                n_servers++;
     2441                                if (n_servers < tot_n_servers)
     2442                                        ptr = addJSONChildEnd(ptr, 1);
     2443                                else
     2444                                        ptr = addJSONChildEnd(ptr, 0);
     2445                        }
     2446                        ptr = addJSONNodeEnd(ptr);
     2447                        ptr = addJSONEnd(ptr);
     2448                }
     2449        }
     2450        /*
     2451        if(!selective)
     2452        printf(" Nodes&Servers %s\n",JSONBuffer);
     2453        else
     2454        printf(" Nodes&Servers %s\n",browserp->JSONBuffer);
     2455        */
    18162456        return(1);
    18172457}
     
    18712511        if(selective)
    18722512        {
    1873                 n_found = find_server_service_pattern(servp, browserp->pattern);
     2513                n_found = find_server_service_pattern(servp, browserp->pattern, 0);
    18742514        }
    18752515        ptr = JSONServices;
  • trunk/FACT++/dim/src/webDid/webServer.c

    r18058 r18920  
    55#include <fcntl.h>
    66
    7 int WebDID_Debug = 0;
     7extern int WebDID_Debug;
     8extern int IsWebDID;
    89
    910#define BUFSIZE 8096
     
    8384}
    8485
    85 int getParameters(char *buffer, char (*pars)[], char *ptrs[])
     86int getParameters(char *buffer, char (*pars)[], char *ptrs[], int nmandatory)
    8687{
    8788        char *ptr, *parptr;
     
    106107        for(i = 0; ptrs[i]; i++)
    107108        {
    108                 if((ptr = strchr(ptrs[i],'&')))
     109            if((ptr = strchr(ptrs[i],'&')))
    109110                        *ptr = '\0';
    110111                while((ptr = strchr(ptrs[i],'%')))
     
    121122                }
    122123        }
    123         if(found == n)
    124                 return 1;
    125         else
    126                 return 0;
     124        if(nmandatory == -1)
     125        {
     126                if(found == n)
     127                        return 1;
     128        }
     129        else if(found >= nmandatory)
     130        {
     131                return found;
     132        }
     133        return 0;
    127134}
    128135
     
    136143        strcpy(pars[1],"browser=");
    137144        pars[2][0] = '\0';
    138         ret = getParameters(buffer, pars, ptrs);
     145        ret = getParameters(buffer, pars, ptrs, -1);
    139146        if(!ret)
    140147                return 0;
     
    158165        strcpy(pars[3],"browser=");
    159166        pars[4][0] = '\0';
    160         ret = getParameters(buffer, pars, ptrs);
     167        ret = getParameters(buffer, pars, ptrs, -1);
    161168        if(!ret)
    162169                return 0;
     
    181188        strcpy(pars[3],"force=");
    182189        pars[4][0] = '\0';
    183         ret = getParameters(buffer, pars, ptrs);
     190        ret = getParameters(buffer, pars, ptrs, -1);
    184191        if(!ret)
    185192                return 0;
     
    190197if(WebDID_Debug)
    191198printf("\nparse service pars - service %s %d %d %d\n\n",service, *req, *browser, *force);
     199        return 1;
     200}
     201
     202int getServiceParametersDim(char *buffer, char *service, void *nolink, int *nolinksize, int *update)
     203{
     204        char pars[10][32];
     205        char *ptrs[10];
     206        int ret;
     207        char nolinkstr[MAX_NAME] = { '\0' }, updatestr[10] = { '\0' };
     208        char servicestr[MAX_NAME];
     209
     210        strcpy(pars[0], "service=");
     211        strcpy(pars[1], "nolink=");
     212        strcpy(pars[2], "update=");
     213        pars[3][0] = '\0';
     214        ret = getParameters(buffer, pars, ptrs, 1);
     215        if (!ret)
     216                return 0;
     217        strcpy(servicestr, ptrs[0]);
     218        if (ptrs[1])
     219            strcpy(nolinkstr, ptrs[1]);
     220        if (ptrs[2])
     221            strcpy(updatestr, ptrs[2]);
     222//      sscanf(ptrs[1], "%d", req);
     223//      sscanf(ptrs[2], "%d", browser);
     224//      sscanf(ptrs[3], "%d", force);
     225        if (servicestr[0] == '"')
     226        {
     227                strcpy((char *)service, &servicestr[1]);
     228                ((char *)service)[strlen(servicestr) - 2] = '\0';
     229        }
     230        else
     231        {
     232                strcpy(service, ptrs[0]);
     233        }
     234        if ((nolink) && (nolinksize))
     235        {
     236                if(nolinkstr[0] != '\0')
     237                {
     238                        if (nolinkstr[0] == '"')
     239                        {
     240                                strcpy((char *)nolink, &nolinkstr[1]);
     241                                ((char *)nolink)[strlen(nolinkstr) - 2] = '\0';
     242                                *nolinksize = strlen(nolinkstr) - 2 + 1;
     243                        }
     244                        else
     245                        {
     246                                sscanf(nolinkstr, "%d", (int *)nolink);
     247                                *nolinksize = sizeof(int);
     248                        }
     249                }
     250                else
     251                {
     252                        *((int *)nolink) = -1;
     253                        *nolinksize = sizeof(int);
     254                }
     255        }
     256        if (update)
     257        {
     258                if (updatestr[0] != '\0')
     259                {
     260                        sscanf(updatestr, "%d", (int *)update);
     261                }
     262        }
     263        if (WebDID_Debug)
     264                printf("\nparse service pars - service %s %s %s\n\n", service, nolinkstr, updatestr);
    192265        return 1;
    193266}
     
    238311}
    239312
    240 void sendData(int conn_id, char *buffer, int type)
     313void sendData(int conn_id, char *buffer, int type, int oper)
    241314{
    242315        static char date_buffer[128];
     
    250323        extern char *getJSONHeader();
    251324        extern char *getJSONBuffer();
     325        extern char *getJSONDimBuffer();
    252326        char datatype[128];
    253327        char *conv_buffer;
     328        int conv_size = 0;
     329        char nolink[MAX_NAME];
     330        int nolinksize;
     331        int update;
    254332
    255333        conv_buffer = buffer;
     
    287365                else
    288366                {
    289                         update_service_data(service, conn_id, 0, req, browser, force);
     367                        update_service_data(service, conn_id, 0, req, browser, force, 1, 0, 0);
    290368                        return;
    291369                }
     
    296374if(WebDID_Debug)
    297375                printf("%s\n",ptr);
     376                strcpy(datatype,"text/html");
     377        }
     378        else if(type == 10)
     379        {
     380                ret = getServiceParametersDim(conv_buffer, service, nolink, &nolinksize, &update);
     381                if(!ret)
     382                {
     383                        strcpy(snd_data_buffer,"{}");
     384                        ptr = snd_data_buffer;
     385                }
     386                else
     387                {
     388                        if (oper == 0)
     389                                update = -1;
     390                        else if (oper == -1)
     391                                update = -2;
     392                        update_service_data(service, conn_id, update, 0, conn_id, 1, 0, nolink, nolinksize);
     393                        return;
     394                }
     395        }
     396        else if(type == 11)
     397        {
     398                ptr = conv_buffer;
     399if(WebDID_Debug)
     400                printf("%s\n",ptr);
     401//              strcpy(datatype,"application/octet-stream");
    298402                strcpy(datatype,"text/html");
    299403        }
     
    330434                }
    331435        }
    332         getTime(date_buffer);
    333         (void)sprintf(snd_buffer,"HTTP/1.1 200 OK\r\nDate: %s\r\nServer: DID/19.7\r\nContent-Length: %d\r\nContent-Type: %s\r\nConnection: close\r\n\r\n",
    334                       date_buffer, (int)strlen(ptr), datatype);
    335     (void)web_write(conn_id,snd_buffer,(int)strlen(snd_buffer));
     436        else if (type == 12)
     437        {
     438                ret = getServiceParametersDim(conv_buffer, service, 0, 0, 0);
     439                if (!ret)
     440                {
     441                        strcpy(snd_data_buffer, "{}");
     442                        ptr = snd_data_buffer;
     443                }
     444                else
     445                {
     446                        find_services(service, conn_id, conn_id, 1);
     447                        ptr = getJSONDimBuffer("src", conn_id);
     448                }
     449        }
     450        if (IsWebDID)
     451        {
     452                getTime(date_buffer);
     453/*
     454                (void)sprintf(snd_buffer, "HTTP/1.1 200 OK\r\nDate: %s\r\nServer: DID/19.7\r\nContent-Length: %d\r\nContent-Type: %s\r\nKeep-Alive: timeout=1000\r\nConnection: keep-alive\r\n\r\n",
     455                        date_buffer, (int)strlen(ptr), datatype);
     456*/
     457                (void)sprintf(snd_buffer, "HTTP/1.1 200 OK\r\nDate: %s\r\nServer: DID/19.7\r\nContent-Length: %d\r\nContent-Type: %s\r\nConnection: close\r\n\r\n",
     458                        date_buffer, (int)strlen(ptr), datatype);
     459                (void)web_write(conn_id, snd_buffer, (int)strlen(snd_buffer));
     460        }
    336461if(WebDID_Debug)
    337462        printf("SENDING DATA to conn %d:\n%s\n",conn_id, snd_buffer);
     
    391516                else
    392517                {
    393                         update_service_data(service, conn_id, 0, req, browser, force);
     518                        update_service_data(service, conn_id, 0, req, browser, force, 0, 0);
    394519                        return;
    395520                }
     
    434559                }
    435560        }
    436         getTime(date_buffer);
    437         (void)sprintf(snd_buffer,"HTTP/1.1 200 OK\r\nDate: %s\r\nServer: DID/19.7\r\nContent-Length: %d\r\nContent-Type: %s\r\nConnection: close\r\n\r\n",
    438                       date_buffer, (int)strlen(ptr), datatype);
    439     (void)web_write(conn_id,snd_buffer,(int)strlen(snd_buffer));
     561        if (IsWebDID)
     562        {
     563                getTime(date_buffer);
     564                (void)sprintf(snd_buffer, "HTTP/1.1 200 OK\r\nDate: %s\r\nServer: DID/19.7\r\nContent-Length: %d\r\nContent-Type: %s\r\nConnection: close\r\n\r\n",
     565                        date_buffer, (int)strlen(ptr), datatype);
     566                (void)web_write(conn_id, snd_buffer, (int)strlen(snd_buffer));
     567        }
    440568if(WebDID_Debug)
    441569        printf("SENDING DATA to conn %d:\n%s\n",conn_id, snd_buffer);
     
    453581        static char snd_buffer[BUFSIZE+1]; /* static so zero filled */
    454582                static char date_buffer[128];
     583                char *ptr;
     584                int operation = 0;
    455585
    456586
     
    462592if(WebDID_Debug)
    463593printf("Got %s\n", buffer);
    464         if( strncmp(buffer,"GET ",4) && strncmp(buffer,"get ",4) )
    465                 {
    466                 log_it(SORRY,"Only simple GET operation supported",buffer,conn_id);
    467                                 return;
    468                 }
    469 
     594        if (IsWebDID)
     595        {
     596                if (strncmp(buffer, "GET ", 4) && strncmp(buffer, "get ", 4))
     597                {
     598                        log_it(SORRY, "Only simple GET operation supported", buffer, conn_id);
     599                        return;
     600                }
     601        }
    470602        for(i=4;i<BUFSIZE;i++)
    471603                { /* null terminate after the second space to ignore extra stuff */
     
    479611if(WebDID_Debug)
    480612printf("Got 1 %s\n", buffer);
    481        for(j=0;j<i-1;j++)      /* check for illegal parent directory use .. */
     613        for(j=0;j<i-1;j++)      /* check for illegal parent directory use .. */
    482614                {
    483615                if(buffer[j] == '.' && buffer[j+1] == '.')
     
    516648                printf("SENDING to conn %d:\n%s\n",conn_id, snd_buffer);
    517649*/
     650                ptr = &buffer[5];
     651                if (!IsWebDID)
     652                {
     653                        if (!strncmp(&buffer[0], "GET", 3) || !strncmp(&buffer[0], "get", 3))
     654                        {
     655                                operation = 0;
     656                        }
     657                        if (!strncmp(&buffer[0], "SUBSCRIBE", 9) || !strncmp(&buffer[0], "subscribe", 9))
     658                        {
     659                                operation = 1;
     660                                ptr = &buffer[11];
     661                        }
     662                        if (!strncmp(&buffer[0], "UNSUBSCRIBE", 11) || !strncmp(&buffer[0], "unsubscribe", 11))
     663                        {
     664                                operation = -1;
     665                                ptr = &buffer[13];
     666                        }
     667                }
    518668                if(fstr == 0)
    519669                {
    520670if(WebDID_Debug)
    521671printf("Got %s\n", buffer);
    522                         if(!strncmp(&buffer[5],"didHeader",9))
    523                         {
    524                                 sendData(conn_id, &buffer[5], 0);
    525                                 return;
    526                         }
    527                         else if(!strncmp(&buffer[5],"didData",7))
    528                         {
    529                                 sendData(conn_id, &buffer[5], 1);
    530                                 return;
    531                         }
    532                         else if(!strncmp(&buffer[5],"didServices",11))
    533                         {
    534                                 sendData(conn_id, &buffer[5], 2);
    535                                 return;
    536                         }
    537                         else if(!strncmp(&buffer[5],"didServiceData",14))
    538                         {
    539                                 sendData(conn_id, &buffer[5], 3);
    540                                 return;
    541                         }
    542                         else if(!strncmp(&buffer[5],"didPoll",7))
    543                         {
    544                                 sendData(conn_id, &buffer[5], 5);
    545                                 return;
    546                         }
    547                         else if(!strncmp(&buffer[5],"didQuery",8))
    548                         {
    549                                 sendData(conn_id, &buffer[5], 6);
    550                                 return;
    551                         }
    552                         else if(!strncmp(&buffer[5],"smiData",7))
    553                         {
    554                                 sendSmiData(conn_id, &buffer[5], 1);
    555                                 return;
    556                         }
    557                         else if(!strncmp(&buffer[5],"smiObjects",10))
    558                         {
    559                                 sendSmiData(conn_id, &buffer[5], 2);
     672            if (!strncmp(ptr, "didHeader", 9))
     673                        {
     674                                sendData(conn_id, ptr, 0, 0);
     675                                return;
     676                        }
     677                        else if (!strncmp(ptr, "didData", 7))
     678                        {
     679                                sendData(conn_id, ptr, 1, 0);
     680                                return;
     681                        }
     682                        else if (!strncmp(ptr, "didServices", 11))
     683                        {
     684                                sendData(conn_id, ptr, 2, 0);
     685                                return;
     686                        }
     687                        else if (!strncmp(ptr, "didServiceData", 14))
     688                        {
     689                                sendData(conn_id, ptr, 3, 0);
     690                                return;
     691                        }
     692                        else if (!strncmp(ptr, "dimService", 10))
     693                        {
     694                                sendData(conn_id, ptr, 10, operation);
     695                                return;
     696                        }
     697                        else if (!strncmp(ptr, "didPoll", 7))
     698                        {
     699                                sendData(conn_id, ptr, 5, 0);
     700                                return;
     701                        }
     702                        else if (!strncmp(ptr, "didQuery", 8))
     703                        {
     704                                sendData(conn_id, ptr, 6, 0);
     705                                return;
     706                        }
     707                        else if (!strncmp(ptr, "dimBrowser", 10))
     708                        {
     709                                sendData(conn_id, ptr, 12, 0);
     710                                return;
     711                        }
     712                        else if (!strncmp(ptr, "smiData", 7))
     713                        {
     714                                sendSmiData(conn_id, ptr, 1);
     715                                return;
     716                        }
     717                        else if (!strncmp(ptr, "smiObjects", 10))
     718                        {
     719                                sendSmiData(conn_id, ptr, 2);
    560720                                return;
    561721                        }
     
    635795static void handler( int conn_id, char *packet, int size, int status )
    636796{
     797        int close_browser();
     798
    637799        switch(status)
    638800        {
     
    644806                                Net_conns[conn_id].task,Net_conns[conn_id].node );
    645807}
    646                         web_close(conn_id);
     808            close_browser(conn_id);
     809            web_close(conn_id);
    647810                break;
    648811        case STA_CONN:     /* connection received */
     
    707870                *ptr = '\0';
    708871        }
    709         chdir(currwd);
    710         log_it(LOG,"webDid starting",argv[1],getpid());
     872//      chdir(currwd);
     873        log_it(LOG,"webDim starting",argv[1],getpid());
    711874        /* setup the network socket */
    712875                proto = 1;
     
    714877                get_node_name(dns_node);
    715878                did_init(dns_node, DNS_PORT);
    716                 if(!web_open_server("DID",handler, &proto, &port, error_handler))
    717                         return(0);
     879                if(IsWebDID)
     880                {
     881                        if (!web_open_server("DID", handler, &proto, &port, error_handler))
     882                                return(0);
     883                }
     884                else
     885                {
     886                        if (!web_open_server("DimClient", handler, &proto, &port, error_handler))
     887                                return(0);
     888                }
    718889/*
    719890                ret = matchString("hello world","*ll*");
Note: See TracChangeset for help on using the changeset viewer.