@@ -914,12 +914,19 @@ int xfopenat(int dir_fd, const char *path, const char *mode, int flags, FILE **r
914914 return 0 ;
915915}
916916
917- static int search_and_fopen_internal (const char * path , const char * mode , const char * root , char * * search , FILE * * _f ) {
917+ static int search_and_fopen_internal (
918+ const char * path ,
919+ const char * mode ,
920+ const char * root ,
921+ char * * search ,
922+ FILE * * ret ,
923+ char * * ret_path ) {
924+
918925 char * * i ;
919926
920927 assert (path );
921928 assert (mode );
922- assert (_f );
929+ assert (ret );
923930
924931 if (!path_strv_resolve_uniq (search , root ))
925932 return - ENOMEM ;
@@ -934,7 +941,10 @@ static int search_and_fopen_internal(const char *path, const char *mode, const c
934941
935942 f = fopen (p , mode );
936943 if (f ) {
937- * _f = f ;
944+ if (ret_path )
945+ * ret_path = path_simplify (TAKE_PTR (p ), true);
946+
947+ * ret = f ;
938948 return 0 ;
939949 }
940950
@@ -945,52 +955,84 @@ static int search_and_fopen_internal(const char *path, const char *mode, const c
945955 return - ENOENT ;
946956}
947957
948- int search_and_fopen (const char * path , const char * mode , const char * root , const char * * search , FILE * * _f ) {
958+ int search_and_fopen (
959+ const char * filename ,
960+ const char * mode ,
961+ const char * root ,
962+ const char * * search ,
963+ FILE * * ret ,
964+ char * * ret_path ) {
965+
949966 _cleanup_strv_free_ char * * copy = NULL ;
950967
951- assert (path );
968+ assert (filename );
952969 assert (mode );
953- assert (_f );
970+ assert (ret );
954971
955- if (path_is_absolute (path )) {
956- FILE * f ;
972+ if (path_is_absolute (filename )) {
973+ _cleanup_fclose_ FILE * f = NULL ;
957974
958- f = fopen (path , mode );
959- if (f ) {
960- * _f = f ;
961- return 0 ;
975+ f = fopen (filename , mode );
976+ if (!f )
977+ return - errno ;
978+
979+ if (ret_path ) {
980+ char * p ;
981+
982+ p = strdup (filename );
983+ if (!p )
984+ return - ENOMEM ;
985+
986+ * ret_path = path_simplify (p , true);
962987 }
963988
964- return - errno ;
989+ * ret = TAKE_PTR (f );
990+ return 0 ;
965991 }
966992
967993 copy = strv_copy ((char * * ) search );
968994 if (!copy )
969995 return - ENOMEM ;
970996
971- return search_and_fopen_internal (path , mode , root , copy , _f );
997+ return search_and_fopen_internal (filename , mode , root , copy , ret , ret_path );
972998}
973999
974- int search_and_fopen_nulstr (const char * path , const char * mode , const char * root , const char * search , FILE * * _f ) {
1000+ int search_and_fopen_nulstr (
1001+ const char * filename ,
1002+ const char * mode ,
1003+ const char * root ,
1004+ const char * search ,
1005+ FILE * * ret ,
1006+ char * * ret_path ) {
1007+
9751008 _cleanup_strv_free_ char * * s = NULL ;
9761009
977- if (path_is_absolute (path )) {
978- FILE * f ;
1010+ if (path_is_absolute (filename )) {
1011+ _cleanup_fclose_ FILE * f = NULL ;
9791012
980- f = fopen (path , mode );
981- if (f ) {
982- * _f = f ;
983- return 0 ;
1013+ f = fopen (filename , mode );
1014+ if (!f )
1015+ return - errno ;
1016+
1017+ if (ret_path ) {
1018+ char * p ;
1019+
1020+ p = strdup (filename );
1021+ if (!p )
1022+ return - ENOMEM ;
1023+
1024+ * ret_path = path_simplify (p , true);
9841025 }
9851026
986- return - errno ;
1027+ * ret = TAKE_PTR (f );
1028+ return 0 ;
9871029 }
9881030
9891031 s = strv_split_nulstr (search );
9901032 if (!s )
9911033 return - ENOMEM ;
9921034
993- return search_and_fopen_internal (path , mode , root , s , _f );
1035+ return search_and_fopen_internal (filename , mode , root , s , ret , ret_path );
9941036}
9951037
9961038int chase_symlinks_and_fopen_unlocked (
0 commit comments