@@ -150,25 +150,43 @@ struct fetch_archive {
150150};
151151
152152static int
153- fetch_archive_open (struct archive * a UNUSED , void * client_data )
153+ fetch_archive_open (struct archive * a , void * client_data )
154154{
155155 struct fetch_archive * f = client_data ;
156156
157157 f -> fetch = fetchGet (f -> url , NULL );
158+ if (!f -> fetch ) {
159+ const char * errstr = xbps_fetch_error_string ();
160+ int err ;
161+ switch (fetchLastErrCode ) {
162+ case FETCH_UNAVAIL :
163+ err = ENOENT ;
164+ break ;
165+ default :
166+ err = EIO ;
167+ break ;
168+ }
169+ archive_set_error (a , err , "%s" , errstr ? errstr : "unknown fetch error" );
170+ return ARCHIVE_FATAL ;
171+ }
158172
159- if (f -> fetch == NULL )
160- return ENOENT ;
161-
162- return 0 ;
173+ return ARCHIVE_OK ;
163174}
164175
165176static ssize_t
166177fetch_archive_read (struct archive * a UNUSED , void * client_data , const void * * buf )
167178{
168179 struct fetch_archive * f = client_data ;
180+ ssize_t rd ;
169181
170182 * buf = f -> buffer ;
171- return fetchIO_read (f -> fetch , f -> buffer , sizeof (f -> buffer ));
183+ rd = fetchIO_read (f -> fetch , f -> buffer , sizeof (f -> buffer ));
184+ if (rd == -1 ) {
185+ const char * errstr = xbps_fetch_error_string ();
186+ archive_set_error (a , EIO , "%s" , errstr ? errstr : "unknown fetch error" );
187+ return -1 ;
188+ }
189+ return rd ;
172190}
173191
174192static int
@@ -222,7 +240,6 @@ xbps_archive_read_open_remote(struct archive *ar, const char *url)
222240 f = calloc (1 , sizeof (* f ));
223241 if (!f ) {
224242 r = - errno ;
225- archive_read_free (ar );
226243 fetchFreeURL (furl );
227244 return r ;
228245 }
@@ -232,8 +249,6 @@ xbps_archive_read_open_remote(struct archive *ar, const char *url)
232249 fetch_archive_close );
233250 if (r == ARCHIVE_FATAL ) {
234251 r = - archive_errno (ar );
235- fetchFreeURL (f -> url );
236- free (f );
237252 return r ;
238253 }
239254
0 commit comments