@@ -242,7 +242,7 @@ lyb_read_start_subtree(const char *data, struct lyb_state *lybs)
242242}
243243
244244static int
245- lyb_parse_model (const char * data , const struct lys_module * * mod , struct lyb_state * lybs )
245+ lyb_parse_model (const char * data , const struct lys_module * * mod , int options , struct lyb_state * lybs )
246246{
247247 int r , ret = 0 ;
248248 char * mod_name = NULL , mod_rev [11 ];
@@ -259,6 +259,14 @@ lyb_parse_model(const char *data, const struct lys_module **mod, struct lyb_stat
259259 if (rev ) {
260260 sprintf (mod_rev , "%04u-%02u-%02u" , ((rev & 0xFE00 ) >> 9 ) + 2000 , (rev & 0x01E0 ) >> 5 , rev & 0x001Fu );
261261 * mod = ly_ctx_get_module (lybs -> ctx , mod_name , mod_rev , 0 );
262+ if ((options & LYD_OPT_LYB_MOD_UPDATE ) && !(* mod )) {
263+ /* try to use an updated module */
264+ * mod = ly_ctx_get_module (lybs -> ctx , mod_name , NULL , 1 );
265+ if (* mod && (!(* mod )-> implemented || !(* mod )-> rev_size || (strcmp ((* mod )-> rev [0 ].date , mod_rev ) < 0 ))) {
266+ /* not an implemented module in a newer revision */
267+ * mod = NULL ;
268+ }
269+ }
262270 } else {
263271 * mod = ly_ctx_get_module (lybs -> ctx , mod_name , NULL , 0 );
264272 }
@@ -823,7 +831,7 @@ lyb_parse_attributes(struct lyd_node *node, const char *data, int options, struc
823831 LYB_HAVE_READ_GOTO (r , data , error );
824832
825833 /* find model */
826- ret += (r = lyb_parse_model (data , & mod , lybs ));
834+ ret += (r = lyb_parse_model (data , & mod , options , lybs ));
827835 LYB_HAVE_READ_GOTO (r , data , error );
828836
829837 if (mod ) {
@@ -1027,7 +1035,7 @@ lyb_parse_subtree(const char *data, struct lyd_node *parent, struct lyd_node **f
10271035
10281036 if (!parent ) {
10291037 /* top-level, read module name */
1030- ret += (r = lyb_parse_model (data , & mod , lybs ));
1038+ ret += (r = lyb_parse_model (data , & mod , options , lybs ));
10311039 LYB_HAVE_READ_GOTO (r , data , error );
10321040
10331041 if (mod ) {
@@ -1149,7 +1157,7 @@ lyb_parse_subtree(const char *data, struct lyd_node *parent, struct lyd_node **f
11491157}
11501158
11511159static int
1152- lyb_parse_data_models (const char * data , struct lyb_state * lybs )
1160+ lyb_parse_data_models (const char * data , int options , struct lyb_state * lybs )
11531161{
11541162 int i , r , ret = 0 ;
11551163
@@ -1163,7 +1171,7 @@ lyb_parse_data_models(const char *data, struct lyb_state *lybs)
11631171
11641172 /* read modules */
11651173 for (i = 0 ; i < lybs -> mod_count ; ++ i ) {
1166- ret += (r = lyb_parse_model (data , & lybs -> models [i ], lybs ));
1174+ ret += (r = lyb_parse_model (data , & lybs -> models [i ], options , lybs ));
11671175 LYB_HAVE_READ_RETURN (r , data , -1 );
11681176 }
11691177 }
@@ -1249,7 +1257,7 @@ lyd_parse_lyb(struct ly_ctx *ctx, const char *data, int options, const struct ly
12491257 LYB_HAVE_READ_GOTO (r , data , finish );
12501258
12511259 /* read used models */
1252- ret += (r = lyb_parse_data_models (data , & lybs ));
1260+ ret += (r = lyb_parse_data_models (data , options , & lybs ));
12531261 LYB_HAVE_READ_GOTO (r , data , finish );
12541262
12551263 /* read subtree(s) */
0 commit comments