return 0;
}
if (uncompress)
- return sat_xfopen_fd(".gz", fd);
+ return sat_xfopen_fd(".gz", fd, 0);
fcntl(fd, F_SETFD, FD_CLOEXEC);
return fdopen(fd, "r");
}
}
FILE *
-sat_xfopen(const char *fn)
+sat_xfopen(const char *fn, const char *mode)
{
char *suf;
gzFile *gzf;
if (!fn)
return 0;
+ if (!mode)
+ mode = "r";
suf = strrchr(fn, '.');
if (!suf || strcmp(suf, ".gz") != 0)
- return fopen(fn, "r");
- gzf = gzopen(fn, "r");
+ return fopen(fn, mode);
+ gzf = gzopen(fn, mode);
if (!gzf)
return 0;
return mygzfopen(gzf);
}
FILE *
-sat_xfopen_fd(const char *fn, int fd)
+sat_xfopen_fd(const char *fn, int fd, const char *mode)
{
char *suf;
gzFile *gzf;
suf = fn ? strrchr(fn, '.') : 0;
- if (!suf || strcmp(suf, ".gz") != 0)
+ if (!mode)
{
int fl = fcntl(fd, F_GETFL, 0);
if (fl == -1)
return 0;
fl &= O_RDONLY|O_WRONLY|O_RDWR;
if (fl == O_WRONLY)
- return fdopen(fd, "w");
+ mode = "w";
else if (fl == O_RDWR)
- return fdopen(fd, "r+");
- return fdopen(fd, "r");
+ mode = "r+";
+ else
+ mode = "r";
}
- gzf = gzdopen(fd, "r");
+ if (!suf || strcmp(suf, ".gz") != 0)
+ return fdopen(fd, mode);
+ gzf = gzdopen(fd, mode);
if (!gzf)
return 0;
return mygzfopen(gzf);
#ifndef SAT_XFOPEN_H
#define SAT_XFOPEN_H
-extern FILE *sat_xfopen(const char *fn);
-extern FILE *sat_xfopen_fd(const char *fn, int fd);
+extern FILE *sat_xfopen(const char *fn, const char *mode);
+extern FILE *sat_xfopen_fd(const char *fn, int fd, const char *mode);
#endif
l = strlen(argv[i]);
if (!strcmp(argv[i], "-"))
fp = stdin;
- else if ((fp = sat_xfopen(argv[i])) == 0)
+ else if ((fp = sat_xfopen(argv[i], 0)) == 0)
{
perror(argv[i]);
exit(1);
l = strlen(argv[i]);
if (!strcmp(argv[i], "-"))
fp = stdin;
- else if ((fp = sat_xfopen(argv[i])) == 0)
+ else if ((fp = sat_xfopen(argv[i], 0)) == 0)
{
perror(argv[i]);
exit(1);
l = strlen(dir) + 128;
fnp = sat_malloc(l+1);
snprintf(fnp, l, "%s/primary.xml.gz", dir);
- if (!(fp = sat_xfopen(fnp)))
+ if (!(fp = sat_xfopen(fnp, 0)))
{
perror(fnp);
exit(1);
repo_add_rpmmd(repo, fp, 0, flags);
fclose(fp);
snprintf(fnp, l, "%s/diskusagedata.xml.gz", dir);
- if ((fp = sat_xfopen(fnp)))
+ if ((fp = sat_xfopen(fnp, 0)))
{
repo_add_rpmmd(repo, fp, 0, flags);
fclose(fp);
fprintf(stderr, "-l parameter too long\n");
exit(1);
}
- while (!(fp = sat_xfopen(fnp)))
+ while (!(fp = sat_xfopen(fnp, 0)))
{
fprintf(stderr, "not opened %s\n", fnp);
if (strlen(locale) > 2)
fprintf(stderr, "-l parameter too long\n");
exit(1);
}
- if ((fp = sat_xfopen(fnp)))
+ if ((fp = sat_xfopen(fnp, 0)))
break;
}
perror(fnp);
if (!strcmp(fn, "packages") || !strcmp(fn, "packages.gz"))
{
sprintf(fnp, "%s/%s", descrdir, fn);
- FILE *fp = sat_xfopen(fnp);
+ FILE *fp = sat_xfopen(fnp, 0);
if (!fp)
{
perror(fn);
else if (!strcmp(fn, "packages.DU") || !strcmp(fn, "packages.DU.gz"))
{
sprintf(fnp, "%s/%s", descrdir, fn);
- FILE *fp = sat_xfopen(fnp);
+ FILE *fp = sat_xfopen(fnp, 0);
if (!fp)
{
perror(fn);
{
#if 0
sprintf(fnp, "%s/%s", descrdir, fn);
- FILE *fp = sat_xfopen(fnp);
+ FILE *fp = sat_xfopen(fnp, 0);
if (!fp)
{
perror(fn);
continue;
strcpy(lang, p + 1);
sprintf(fnp, "%s/%s", descrdir, fn);
- FILE *fp = sat_xfopen(fnp);
+ FILE *fp = sat_xfopen(fnp, 0);
if (!fp)
{
perror(fn);