+/*
+ * Check parent directory for write permission and create if it doesn't
+ * exist.
+ */
+chkparent(name)
+ char *name;
+{
+ register char *cp, *dir;
+ extern int userid, groupid;
+
+ cp = rindex(name, '/');
+ if (cp == NULL)
+ dir = ".";
+ else if (cp == name) {
+ dir = "/";
+ cp = NULL;
+ } else {
+ dir = name;
+ *cp = '\0';
+ }
+ if (access(dir, 2) == 0) {
+ if (cp != NULL)
+ *cp = '/';
+ return(0);
+ }
+ if (errno == ENOENT) {
+ if (rindex(dir, '/') != NULL && chkparent(dir) < 0)
+ goto bad;
+ if (!strcmp(dir, ".") || !strcmp(dir, "/"))
+ goto bad;
+ if (mkdir(dir, 0777 & ~sumask) < 0)
+ goto bad;
+ if (chown(dir, userid, groupid) < 0) {
+ (void) unlink(dir);
+ goto bad;
+ }
+ if (cp != NULL)
+ *cp = '/';
+ return(0);
+ }
+
+bad:
+ if (cp != NULL)
+ *cp = '/';
+ return(-1);
+}
+