44 * @brief libnetconf2 - general session functions
55 *
66 * @copyright
7- * Copyright (c) 2015 - 2023 CESNET, z.s.p.o.
7+ * Copyright (c) 2015 - 2026 CESNET, z.s.p.o.
88 *
99 * This source code is licensed under BSD 3-Clause License (the "License").
1010 * You may not use this file except in compliance with the License.
@@ -663,6 +663,31 @@ nc_session_get_ctx(const struct nc_session *session)
663663 return session -> ctx ;
664664}
665665
666+ API const char * const *
667+ nc_session_get_cpblts (const struct nc_session * session )
668+ {
669+ NC_CHECK_ARG_RET (session , session , NULL );
670+
671+ return (const char * const * )session -> cpblts ;
672+ }
673+
674+ API const char *
675+ nc_session_cpblt (const struct nc_session * session , const char * capab )
676+ {
677+ int i , len ;
678+
679+ NC_CHECK_ARG_RET (session , session , capab , NULL );
680+
681+ len = strlen (capab );
682+ for (i = 0 ; session -> cpblts [i ]; ++ i ) {
683+ if (!strncmp (session -> cpblts [i ], capab , len )) {
684+ return session -> cpblts [i ];
685+ }
686+ }
687+
688+ return NULL ;
689+ }
690+
666691API void
667692nc_session_set_data (struct nc_session * session , void * data )
668693{
@@ -1106,15 +1131,11 @@ nc_session_free(struct nc_session *session, void (*data_free)(void *))
11061131 free (session -> username );
11071132 free (session -> host );
11081133 free (session -> path );
1109-
1110- if (session -> side == NC_CLIENT ) {
1111- /* list of server's capabilities */
1112- if (session -> opts .client .cpblts ) {
1113- for (i = 0 ; session -> opts .client .cpblts [i ]; i ++ ) {
1114- free (session -> opts .client .cpblts [i ]);
1115- }
1116- free (session -> opts .client .cpblts );
1134+ if (session -> cpblts ) {
1135+ for (i = 0 ; session -> cpblts [i ]; i ++ ) {
1136+ free (session -> cpblts [i ]);
11171137 }
1138+ free (session -> cpblts );
11181139 }
11191140
11201141 if (session -> data && data_free ) {
@@ -1440,24 +1461,30 @@ nc_server_get_cpblts(const struct ly_ctx *ctx)
14401461 return _nc_server_get_cpblts_version (ctx , LYS_VERSION_UNDEF , 0 );
14411462}
14421463
1464+ /**
1465+ * @brief Parse received capabilities.
1466+ *
1467+ * @param[in] capabilities Opaque capability nodes.
1468+ * @param[out] list List of parsed capabilities terminated by NULL.
1469+ * @return NETCONF version;
1470+ * @return -1 on error.
1471+ */
14431472static int
1444- parse_cpblts (struct lyd_node * capabilities , char * * * list )
1473+ nc_parse_cpblts (struct lyd_node * capabilities , char * * * list )
14451474{
14461475 struct lyd_node * iter ;
14471476 struct lyd_node_opaq * cpblt ;
14481477 int ver = -1 , i = 0 ;
14491478 const char * cpb_start , * cpb_end ;
14501479
1451- if (list ) {
1452- /* get the storage for server's capabilities */
1453- LY_LIST_FOR (lyd_child (capabilities ), iter ) {
1454- i ++ ;
1455- }
1456- /* last item remains NULL */
1457- * list = calloc (i + 1 , sizeof * * list );
1458- NC_CHECK_ERRMEM_RET (!* list , -1 );
1459- i = 0 ;
1480+ /* get the storage for capabilities */
1481+ LY_LIST_FOR (lyd_child (capabilities ), iter ) {
1482+ i ++ ;
14601483 }
1484+ /* last item remains NULL */
1485+ * list = calloc (i + 1 , sizeof * * list );
1486+ NC_CHECK_ERRMEM_RET (!* list , -1 );
1487+ i = 0 ;
14611488
14621489 LY_LIST_FOR (lyd_child (capabilities ), iter ) {
14631490 cpblt = (struct lyd_node_opaq * )iter ;
@@ -1483,11 +1510,9 @@ parse_cpblts(struct lyd_node *capabilities, char ***list)
14831510 }
14841511
14851512 /* store capabilities */
1486- if (list ) {
1487- (* list )[i ] = strndup (cpb_start , cpb_end - cpb_start );
1488- NC_CHECK_ERRMEM_RET (!(* list )[i ], -1 );
1489- i ++ ;
1490- }
1513+ (* list )[i ] = strndup (cpb_start , cpb_end - cpb_start );
1514+ NC_CHECK_ERRMEM_RET (!(* list )[i ], -1 );
1515+ i ++ ;
14911516 }
14921517
14931518 if (ver == -1 ) {
@@ -1644,7 +1669,7 @@ nc_client_recv_hello_io(struct nc_session *session)
16441669 }
16451670 flag = 1 ;
16461671
1647- if ((ver = parse_cpblts (& node -> node , & session -> opts . client . cpblts )) < 0 ) {
1672+ if ((ver = nc_parse_cpblts (& node -> node , & session -> cpblts )) < 0 ) {
16481673 rc = NC_MSG_ERROR ;
16491674 goto cleanup ;
16501675 }
@@ -1723,7 +1748,7 @@ nc_server_recv_hello_io(struct nc_session *session)
17231748 }
17241749 flag = 1 ;
17251750
1726- if ((ver = parse_cpblts (& node -> node , NULL )) < 0 ) {
1751+ if ((ver = nc_parse_cpblts (& node -> node , & session -> cpblts )) < 0 ) {
17271752 rc = NC_MSG_BAD_HELLO ;
17281753 goto cleanup ;
17291754 }
0 commit comments