Changeset 18920 for trunk/FACT++/dim/src


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/src
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • 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.