Hi list,

I am trying to add a attribute "Public Key" (20 bytes length) to the description of a service, but I get a segfault (see code below).

Following some examples in the bluez source code
(and in http://people.csail.mit.edu/people/albert/pubs/ashuang-sm-thesis-2005.pdf)
I have managed to add successfully the PSM and the protocol version attributes to the service description, but I could not find examples of adding "custom" parameters.

I am sure that I still have to provide an identifier to the attribute, but could not find out how to do it.

Any further help will be appreciated.

Here is the code :

---- snip ----

int main()
{
    int ret = 0;
    uint32_t service_uuid_int[] = { 0, 0, 0, 0x00FF };
    uint16_t l2cap_psm = 1111, ver = 0x001;
    uuid_t root_uuid, l2cap_uuid, svc_uuid;

    sdp_list_t    *l2cap_list = 0 ,
            *root_list = 0 ,
            *proto_list = 0 ,
            *access_proto_list = 0 ;

    sdp_data_t *psm = 0 , *version = 0, *psha1 = 0;

    const char *service_name = "new service";
    const char *service_dsc = "description of my service" ;
    const char *service_prov = "Bluetooth Access Point" ;

    // this is the key I want to put in the parameter
    const char *pubsha1 = "0123456789abcdef6789" ;
   
    sdp_record_t *record = sdp_record_alloc();
   
    // set the general service ID
    sdp_uuid128_create (&svc_uuid, &service_uuid_int) ;
    sdp_set_service_id (record, svc_uuid) ;
   
    // make the service record publicly browsable
    sdp_uuid16_create (&root_uuid, PUBLIC_BROWSE_GROUP) ;
    root_list = sdp_list_append (0, &root_uuid) ;
    sdp_set_browse_groups (record, root_list) ;
    sdp_list_free (root_list, 0);

    // set l2cap information
    sdp_uuid16_create (&l2cap_uuid, L2CAP_UUID) ;
    l2cap_list = sdp_list_append (0, &l2cap_uuid) ;

    // set PSM information
    psm = sdp_data_alloc (SDP_UINT16, &l2cap_psm) ;
    l2cap_list = sdp_list_append (l2cap_list, psm) ;

    // set protocol version
    version = sdp_data_alloc(SDP_UINT16, &ver);
    l2cap_list = sdp_list_append(l2cap_list, version);

    // set key parameter
    psha1 = sdp_data_alloc(SDP_TEXT_STR16, pubsha1) ;
    l2cap_list = sdp_list_append (l2cap_list, psha1) ;

    proto_list = sdp_list_append (0 , l2cap_list) ;

    // attach protocol information to service record
    access_proto_list = sdp_list_append ( 0 , proto_list ) ;
printf("The next line causes segmentation fault\n");
    sdp_set_access_protos ( record, access_proto_list ) ;
printf("not reached\n");

    // set the name, provider , and description
    sdp_set_info_attr (record, service_name, service_prov, service_dsc ) ;
   
    // connect to the local SDP server and register the service record
    sdp_session_t *session = 0 ;

    session = sdp_connect ( BDADDR_ANY, BDADDR_LOCAL, SDP_RETRY_IF_BUSY ) ;
    ret = sdp_record_register ( session , record , SDP_RECORD_PERSIST ) ;
    if (ret < 0) {
        printf("Service Record registration failed\n");
        ret = -1;
       
    }

    printf("Service registration completed\n");

    // cleanup
    sdp_list_free (l2cap_list, 0);
    sdp_list_free (access_proto_list, 0);
    sdp_record_free (record);

    return ret;
}

--- snap ---

Best regards,

Jordi