2 * FreeBSD install - a package for the installation and maintainance
3 * of non-core utilities.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
17 * URL file access utilities.
21 #include <sys/cdefs.h>
22 __FBSDID("$FreeBSD$");
32 * Try and fetch a file by URL, returning the directory name for where
33 * it's unpacked, if successful.
36 fileGetURL(const char *base
, const char *spec
, int keep_package
)
39 char fname
[FILENAME_MAX
];
40 char pen
[FILENAME_MAX
];
41 char pkg
[FILENAME_MAX
];
45 int pfd
[2], pstat
, r
, w
= 0;
50 /* Special tip that sysinstall left for us */
51 hint
= getenv("PKG_ADD_BASE");
56 * We've been given an existing URL (that's known-good) and now we need
57 * to construct a composite one out of that and the basename we were
58 * handed as a dependency.
63 * Advance back two slashes to get to the root of the package
66 cp
= strrchr(fname
, '/');
68 *cp
= '\0'; /* chop name */
69 cp
= strrchr(fname
, '/');
82 * Otherwise, we've been given an environment variable hinting
83 * at the right location from sysinstall
87 strcat(fname
, ".tbz");
94 tmp
= getenv("PKGDIR");
95 strlcpy(pkg
, tmp
? tmp
: ".", sizeof(pkg
));
96 tmp
= basename(fname
);
97 strlcat(pkg
, "/", sizeof(pkg
));
98 strlcat(pkg
, tmp
, sizeof(pkg
));
99 if ((pkgfd
= open(pkg
, O_WRONLY
|O_CREAT
|O_TRUNC
, 0644)) == -1) {
100 printf("Error: Unable to open %s\n", pkg
);
106 fetchDebug
= (Verbose
> 0);
107 if ((ftp
= fetchGetURL(fname
, Verbose
? "v" : NULL
)) == NULL
) {
108 printf("Error: FTP Unable to get %s: %s\n",
109 fname
, fetchLastErrString
);
113 if (isatty(0) || Verbose
)
114 printf("Fetching %s...", fname
), fflush(stdout
);
116 if ((rp
= make_playpen(pen
, 0)) == NULL
) {
117 printf("Error: Unable to construct a new playpen for FTP!\n");
121 if (pipe(pfd
) == -1) {
126 if ((tpid
= fork()) == -1) {
133 for (fd
= getdtablesize() - 1; fd
>= 3; --fd
)
135 execl("/usr/bin/tar", "tar",
136 Verbose
? "-xpjvf" : "-xpjf",
142 if ((r
= fread(buf
, 1, sizeof buf
, ftp
)) < 1)
144 if ((w
= write(pfd
[1], buf
, r
)) != r
)
147 if ((w
= write(pkgfd
, buf
, r
)) != r
)
152 warn("warning: error reading from server");
159 warn("warning: error writing to tar");
160 tpid
= waitpid(tpid
, &pstat
, 0);
162 printf("tar command returns %d status\n", WEXITSTATUS(pstat
));
163 if (rp
&& (isatty(0) || Verbose
))