+static FILE *wim_get_fp(WIMStruct *w)
+{
+ pthread_mutex_lock(&w->fp_tab_mutex);
+ FILE *fp;
+
+ wimlib_assert(w->filename != NULL);
+
+ for (size_t i = 0; i < w->num_allocated_fps; i++) {
+ if (w->fp_tab[i]) {
+ fp = w->fp_tab[i];
+ w->fp_tab[i] = NULL;
+ goto out;
+ }
+ }
+ DEBUG("Opening extra file descriptor to `%s'", w->filename);
+ fp = fopen(w->filename, "rb");
+ if (!fp)
+ ERROR_WITH_ERRNO("Failed to open `%s'", w->filename);
+out:
+ pthread_mutex_unlock(&w->fp_tab_mutex);
+ return fp;
+}
+
+static int wim_release_fp(WIMStruct *w, FILE *fp)
+{
+ int ret = 0;
+ FILE **fp_tab;
+
+ pthread_mutex_lock(&w->fp_tab_mutex);
+
+ for (size_t i = 0; i < w->num_allocated_fps; i++) {
+ if (w->fp_tab[i] == NULL) {
+ w->fp_tab[i] = fp;
+ goto out;
+ }
+ }
+
+ fp_tab = REALLOC(w->fp_tab, sizeof(FILE*) * (w->num_allocated_fps + 4));
+ if (!fp_tab) {
+ ret = WIMLIB_ERR_NOMEM;
+ goto out;
+ }
+ w->fp_tab = fp_tab;
+ memset(&w->fp_tab[w->num_allocated_fps], 0, 4 * sizeof(FILE*));
+ w->fp_tab[w->num_allocated_fps] = fp;
+ w->num_allocated_fps += 4;
+out:
+ pthread_mutex_unlock(&w->fp_tab_mutex);
+ return ret;
+}
+