7 /* just to put a marker in librpm.a */
8 const char * RPMVERSION = VERSION;
10 #include "rpmio_internal.h"
12 #include <rpmmacro.h> /* XXX for rpmGetPath */
18 rpmRC rpmMkdirPath (const char * dpath, const char * dname)
23 if ((rc = Stat(dpath, &st)) < 0) {
24 int ut = urlPath(dpath, NULL);
33 rc = Mkdir(dpath, 0755);
39 rpmError(RPMERR_CREATE, _("cannot create %%%s %s\n"), dname, dpath);
43 if ((rc = Access(dpath, W_OK))) {
44 rpmError(RPMERR_CREATE, _("cannot write to %%%s %s\n"), dname, dpath);
51 char ** splitString(const char * str, int length, char sep)
59 s = xmalloc(length + 1);
62 for (source = str, dest = s, i = 0; i < length; i++, source++, dest++) {
64 if (*dest == sep) fields++;
69 list = xmalloc(sizeof(*list) * (fields + 1));
84 /*@-nullret@*/ /* FIX: list[i] is NULL */
90 void freeSplitString(char ** list)
92 /*@-unqualifiedtrans@*/
93 list[0] = _free(list[0]);
94 /*@=unqualifiedtrans@*/
98 int doputenv(const char *str)
102 /* FIXME: this leaks memory! */
103 a = xmalloc(strlen(str) + 1);
108 int dosetenv(const char * name, const char * value, int overwrite)
112 if (!overwrite && getenv(name)) return 0;
114 /* FIXME: this leaks memory! */
115 a = xmalloc(strlen(name) + strlen(value) + sizeof("="));
116 (void) stpcpy( stpcpy( stpcpy( a, name), "="), value);
120 int makeTempFile(const char * prefix, const char ** fnptr, FD_t * fdptr)
122 const char * tpmacro = "%{?_tmppath:%{_tmppath}}%{!?_tmppath:/var/tmp}";
123 const char * tempfn = NULL;
124 const char * tfn = NULL;
125 static int _initialized = 0;
131 if (!prefix) prefix = "";
134 /* Create the temp directory if it doesn't already exist. */
138 tempfn = rpmGenPath(prefix, tpmacro, NULL);
139 if (rpmioMkpath(tempfn, 0755, (uid_t) -1, (gid_t) -1))
144 /* XXX should probably use mkstemp here */
146 ran = rand() % 100000;
148 /* maybe this should use link/stat? */
153 sprintf(tfnbuf, "rpm-tmp.%d", ran++);
154 tempfn = _free(tempfn);
155 tempfn = rpmGenPath(prefix, tpmacro, tfnbuf);
157 strcpy(tfnbuf, "rpm-tmp.XXXXXX");
158 tempfn = _free(tempfn);
159 tempfn = rpmGenPath(prefix, tpmacro, mktemp(tfnbuf));
162 temput = urlPath(tempfn, &tfn);
163 if (*tfn == '\0') goto errxit;
169 /*@notreached@*/ /*@switchbreak@*/ break;
171 /*@switchbreak@*/ break;
174 fd = Fopen(tempfn, "w+x.ufdio");
175 /* XXX FIXME: errno may not be correct for ufdio */
176 } while ((fd == NULL || Ferror(fd)) && errno == EEXIST);
178 if (fd == NULL || Ferror(fd))
184 { struct stat sb, sb2;
185 if (!stat(tfn, &sb) && S_ISLNK(sb.st_mode)) {
186 rpmError(RPMERR_SCRIPT, _("error creating temporary file %s\n"), tfn);
190 if (sb.st_nlink != 1) {
191 rpmError(RPMERR_SCRIPT, _("error creating temporary file %s\n"), tfn);
195 if (fstat(Fileno(fd), &sb2) == 0) {
196 if (sb2.st_ino != sb.st_ino || sb2.st_dev != sb.st_dev) {
197 rpmError(RPMERR_SCRIPT, _("error creating temporary file %s\n"), tfn);
210 tempfn = _free(tempfn);
217 tempfn = _free(tempfn);
219 if (fd != NULL) (void) Fclose(fd);
224 char * currentDirectory(void)
227 char * currDir = NULL;
231 currDir = xrealloc(currDir, currDirLen);
232 memset(currDir, 0, currDirLen);
233 } while (getcwd(currDir, currDirLen) == NULL && errno == ERANGE);
239 * XXX This is a "dressed" entry to headerGetEntry to do:
240 * 1) DIRNAME/BASENAME/DIRINDICES -> FILENAMES tag conversions.
241 * 2) i18n lookaside (if enabled).
243 int rpmHeaderGetEntry(Header h, int_32 tag, int_32 *type,
247 case RPMTAG_OLDFILENAMES:
248 { const char ** fl = NULL;
250 rpmfiBuildFNames(h, RPMTAG_BASENAMES, &fl, &count);
254 if (type) *type = RPM_STRING_ARRAY_TYPE;
259 } /*@notreached@*/ break;
262 case RPMTAG_DESCRIPTION:
269 (void) stpcpy( stpcpy( stpcpy( fmt, "%{"), tagName(tag)), "}\n");
271 /* XXX FIXME: memory leak. */
272 msgstr = headerSprintf(h, fmt, rpmTagTable, rpmHeaderFormats, &errstr);
274 *p = (void *) msgstr;
275 if (type) *type = RPM_STRING_TYPE;
282 } /*@notreached@*/ break;
285 return headerGetEntry(h, tag, type, p, c);
286 /*@notreached@*/ break;