#endif /*S_SPLINT_S */
#define afs_stat stat64
#define afs_fstat fstat64
-#ifdef AFS_NT40_ENV
-#define afs_open nt_open
-#else
-#define afs_open open64
-#endif
#define afs_fopen fopen64
#else /* !O_LARGEFILE */
#ifdef S_SPLINT_S
#endif /*S_SPLINT_S */
#define afs_stat stat
#define afs_fstat fstat
-#ifdef AFS_NT40_ENV
-#define afs_open nt_open
-#else
-#define afs_open open
-#endif
#define afs_fopen fopen
#endif /* !O_LARGEFILE */
/*@=fcnmacros =macrofcndecl@*/
return nBytes;
}
-
-
#ifdef AFS_NT40_ENV
/* Inode number format:
* low 32 bits - if a regular file or directory, the vnode; else the type.
* group at once.
*/
-
+#ifndef AFS_NT40_ENV
typedef struct {
int ogm_owner;
int ogm_group;
int ogm_mode;
} namei_ogm_t;
+#endif
static int GetFreeTag(IHandle_t * ih, int vno);
*/
volutil_PartitionName_r(ih->ih_dev, name->n_base, sizeof(name->n_base));
offset = VICE_PREFIX_SIZE + (ih->ih_dev > 25 ? 2 : 1);
- name->n_base[offset] = '/';
+ name->n_base[offset] = OS_DIRSEPC;
offset++;
strlcpy(name->n_base + offset, INODEDIR, sizeof(name->n_base) - offset);
strlcpy(name->n_path, name->n_base, sizeof(name->n_path));
}
#endif
-#define addtoname(N, C) \
-do { \
- strlcat((N)->n_path, OS_DIRSEP, sizeof((N)->n_path)); \
- strlcat((N)->n_path, (C), sizeof((N)->n_path)); \
+#define addtoname(N, C) \
+do { \
+ if ((N)->n_path[strlen((N)->n_path)-1] != OS_DIRSEPC) \
+ strlcat((N)->n_path, OS_DIRSEP, sizeof((N)->n_path)); \
+ strlcat((N)->n_path, (C), sizeof((N)->n_path)); \
} while(0)
namei_HandleToName(namei_t * name, IHandle_t * ih)
{
int vno = (int)(ih->ih_ino & NAMEI_VNODEMASK);
+ int special = (ih->ih_ino & NAMEI_INODESPECIAL)?1:0;
int tag = (int)((ih->ih_ino >> NAMEI_TAGSHIFT) & NAMEI_TAGMASK);
b32_string_t str1;
char *namep;
namei_HandleToVolDir(name, ih);
- if (vno == NAMEI_VNODESPECIAL) {
- name->n_dir[0] = 'R';
+ if (special) {
+ name->n_dir[0] = NAMEI_SPECDIRC;
} else {
if (vno & 0x1)
name->n_dir[0] = 'Q';
(void)afs_snprintf(filename, sizeof filename, "%s" OS_DIRSEP "%s" OS_DIRSEP "README",
partition, INODEDIR);
- fd = afs_open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0444);
- if (fd >= 0) {
- (void)write(fd, VICE_README, strlen(VICE_README));
- close(fd);
+ fd = OS_OPEN(filename, O_WRONLY | O_CREAT | O_TRUNC, 0444);
+ if (fd != INVALID_FD) {
+ (void)OS_WRITE(fd, VICE_README, strlen(VICE_README));
+ OS_CLOSE(fd);
}
return (errno);
}
int i;
*created = 0;
- afs_snprintf(tmp, 256, "%s\\%s", name->n_drive, name->n_voldir);
+ afs_snprintf(tmp, 256, "%s" OS_DIRSEP "%s", name->n_drive, name->n_voldir);
if (mkdir(tmp) < 0) {
if (errno != EEXIST)
s = tmp;
s += strlen(tmp);
- *s++ = '\\';
+ *s++ = OS_DIRSEPC;
*(s + 1) = '\0';
- for (i = 'A'; i <= 'R'; i++) {
+ for (i = 'A'; i <= NAMEI_SPECDIRC; i++) {
*s = (char)i;
if (mkdir(tmp) < 0 && errno != EEXIST)
return -1;
#define create_nextdir(A) \
do { \
- strcat(tmp, "/"); strcat(tmp, A); create_dir(); \
+ strcat(tmp, OS_DIRSEP); strcat(tmp, A); create_dir(); \
} while(0)
static int
if (*tree) {
/* delete the children first */
- cp = strchr(tree, '/');
+ cp = strchr(tree, OS_DIRSEPC);
if (cp) {
delTree(root, cp + 1, errp);
*cp = '\0';
/* since root is big enough, we reuse the space to
* concatenate the dirname to the current tree
*/
- strcat(root, "/");
+ strcat(root, OS_DIRSEP);
strcat(root, dirp->d_name);
if (afs_stat(root, &st) == 0 && S_ISDIR(st.st_mode)) {
/* delete this subtree */
char tmp[256];
int i;
- afs_snprintf(tmp, 256, "%s\\%s", name->n_drive, name->n_voldir);
+ afs_snprintf(tmp, 256, "%s" OS_DIRSEP "%s", name->n_drive, name->n_voldir);
path = tmp;
path += strlen(path);
- *path++ = '\\';
+ *path++ = OS_DIRSEPC;
*(path + 1) = '\0';
- for (i = 'A'; i <= 'R'; i++) {
+ for (i = 'A'; i <= NAMEI_SPECDIRC; i++) {
*path = (char)i;
if (rmdir(name->n_path) < 0 && errno != ENOENT)
code = -1;
ino = NAMEI_INODESPECIAL;
#ifdef AFS_NT40_ENV
ino |= type;
+ /* tag is always 0 for special */
#else
type &= NAMEI_TAGMASK;
ino |= ((Inode) type) << NAMEI_TAGSHIFT;
return ino;
}
-/* SetOGM - set owner group and mode bits from parm and tag */
+#ifdef AFS_NT40_ENV
+/* SetOGM */
static int
SetOGM(FD_t fd, int parm, int tag)
{
-#ifndef AFS_NT40_ENV
-/*
- * owner - low 15 bits of parm.
- * group - next 15 bits of parm.
- * mode - 2 bits of parm, then lowest = 3 bits of tag.
- */
- int owner, group, mode;
-
- owner = parm & 0x7fff;
- group = (parm >> 15) & 0x7fff;
- if (fchown(fd, owner, group) < 0)
- return -1;
-
- mode = (parm >> 27) & 0x18;
- mode |= tag & 0x7;
- if (fchmod(fd, mode) < 0)
- return -1;
-#endif
- return 0;
+ return -1;
}
-#ifdef AFS_NT40_ENV
static int
CheckOGM(namei_t *name, FdHandle_t *fdP, int p1)
{
return 0;
}
-#else
+#else /* AFS_NT40_ENV */
+/* SetOGM - set owner group and mode bits from parm and tag */
+static int
+SetOGM(FD_t fd, int parm, int tag)
+{
+/*
+ * owner - low 15 bits of parm.
+ * group - next 15 bits of parm.
+ * mode - 2 bits of parm, then lowest = 3 bits of tag.
+ */
+ int owner, group, mode;
+
+ owner = parm & 0x7fff;
+ group = (parm >> 15) & 0x7fff;
+ if (fchown(fd, owner, group) < 0)
+ return -1;
+
+ mode = (parm >> 27) & 0x18;
+ mode |= tag & 0x7;
+ if (fchmod(fd, mode) < 0)
+ return -1;
+ return 0;
+}
+
/* GetOGM - get parm and tag from owner, group and mode bits. */
static void
GetOGMFromStat(struct afs_stat *status, int *parm, int *tag)
return 0;
}
-#endif
+#endif /* !AFS_NT40_ENV */
int big_vno = 0; /* Just in case we ever do 64 bit vnodes. */
IHandle_t tmp;
FdHandle_t *fdP;
FdHandle_t tfd;
- int tag, i;
+ int type, tag;
FILETIME ftime;
char *p;
b32_string_t str1;
return -1;
}
- if (p2 == -1) {
+ if (p2 == INODESPECIAL) {
/* Parameters for special file:
* p1 - volume id - goes into owner/group/mode
- * p2 - vnode == -1
+ * p2 - vnode == INODESPECIAL
* p3 - type
* p4 - parent volume id
*/
ftime.dwHighDateTime = p1;
ftime.dwLowDateTime = p2;
- tag = p3;
+ type = p3;
tmp.ih_vid = p4; /* Use parent volume id, where this file will be. */
tmp.ih_ino = namei_MakeSpecIno(p1, p3);
} else {
namei_HandleToName(&name, &tmp);
p = strrchr((char *)&name.n_path, '.');
p++;
- for (i = 0; i < NAMEI_MAXVOLS; i++) {
- *p = *int_to_base32(str1, i);
- fd = nt_open((char *)&name.n_path, O_CREAT | O_RDWR | O_TRUNC | O_EXCL, 0666);
+ for (tag = 0; tag < NAMEI_MAXVOLS; tag++) {
+ *p = *int_to_base32(str1, tag);
+ fd = OS_OPEN((char *)&name.n_path, O_CREAT | O_RDWR | O_TRUNC | O_EXCL, 0666);
+ if (fd == INVALID_FD) {
+ if (errno == ENOTDIR || errno == ENOENT) {
+ if (namei_CreateDataDirectories(&name, &created_dir) == 0)
+ fd = OS_OPEN((char *)&name.n_path, O_CREAT | O_RDWR | O_TRUNC | O_EXCL, 0666);
+ }
+ }
+
if (fd != INVALID_FD)
break;
- if (p2 == -1 && p3 == VI_LINKTABLE)
+ if (p2 == INODESPECIAL && p3 == VI_LINKTABLE)
break;
}
if (fd == INVALID_FD) {
code = -1;
goto bad;
}
- tmp.ih_ino &= ~((Inode) NAMEI_TAGMASK << NAMEI_TAGSHIFT);
- tmp.ih_ino |= ((Inode) i << NAMEI_TAGSHIFT);
+ tmp.ih_ino &= ~(((Inode) NAMEI_TAGMASK) << NAMEI_TAGSHIFT);
+ tmp.ih_ino |= (((Inode) tag) << NAMEI_TAGSHIFT);
if (!code) {
if (!SetFileTime((HANDLE) fd, &ftime, NULL, NULL)) {
}
if (!code) {
- if (p2 != -1) {
+ if (p2 != INODESPECIAL) {
if (fd == INVALID_FD) {
errno = ENOENT;
code = nt_unlink((char *)&name.n_path);
}
code = namei_SetLinkCount(fdP, tmp.ih_ino, 1, 0);
FDH_CLOSE(fdP);
- } else if (p2 == -1 && p3 == VI_LINKTABLE) {
+ } else if (p2 == INODESPECIAL && p3 == VI_LINKTABLE) {
if (fd == INVALID_FD)
goto bad;
/* hack at tmp to setup for set link count call. */
bad:
if (fd != INVALID_FD)
- nt_close(fd);
+ OS_CLOSE(fd);
if (code || (fd == INVALID_FD)) {
- if (p2 != -1) {
+ if (p2 != INODESPECIAL) {
fdP = IH_OPEN(lh);
if (fdP) {
namei_SetLinkCount(fdP, tmp.ih_ino, 0, 0);
errno = save_errno;
}
}
- return (code || (fd == INVALID_FD)) ? (Inode) - 1 : tmp.ih_ino;
+ return (code || (fd == INVALID_FD)) ? (Inode) -1 : tmp.ih_ino;
}
-#else
+#else /* !AFS_NT40_ENV */
Inode
namei_icreate(IHandle_t * lh, char *part, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4)
{
namei_t name;
- int fd = -1;
+ int fd = INVALID_FD;
int code = 0;
int created_dir = 0;
IHandle_t tmp;
}
namei_HandleToName(&name, &tmp);
- fd = afs_open(name.n_path, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0);
- if (fd < 0) {
+ fd = OS_OPEN(name.n_path, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0);
+ if (fd == INVALID_FD) {
if (errno == ENOTDIR || errno == ENOENT) {
if (namei_CreateDataDirectories(&name, &created_dir) < 0)
goto bad;
- fd = afs_open(name.n_path, O_CREAT | O_EXCL | O_TRUNC | O_RDWR,
+ fd = OS_OPEN(name.n_path, O_CREAT | O_EXCL | O_TRUNC | O_RDWR,
0);
- if (fd < 0)
+ if (fd == INVALID_FD)
goto bad;
} else {
goto bad;
}
}
if (SetOGM(fd, ogm_parm, tag) < 0) {
- close(fd);
- fd = -1;
+ OS_CLOSE(fd);
+ fd = INVALID_FD;
goto bad;
}
- if (p2 == -1 && p3 == VI_LINKTABLE) {
+ if (p2 == (afs_uint32)-1 && p3 == VI_LINKTABLE) {
/* hack at tmp to setup for set link count call. */
memset((void *)&tfd, 0, sizeof(FdHandle_t)); /* minimalistic still, but a little cleaner */
tfd.fd_ih = &tmp;
}
bad:
- if (fd >= 0)
- close(fd);
+ if (fd != INVALID_FD)
+ OS_CLOSE(fd);
- if (code || (fd < 0)) {
+ if (code || (fd == INVALID_FD)) {
if (p2 != -1) {
fdP = IH_OPEN(lh);
if (fdP) {
}
}
}
- return (code || (fd < 0)) ? (Inode) - 1 : tmp.ih_ino;
+ return (code || (fd == INVALID_FD)) ? (Inode) - 1 : tmp.ih_ino;
}
#endif
/* Convert handle to file name. */
namei_HandleToName(&name, h);
- fd = afs_open((char *)&name.n_path, O_RDWR, 0666);
+ fd = OS_OPEN((char *)&name.n_path, O_RDWR, 0666);
return fd;
}
int
namei_copy_on_write(IHandle_t *h)
{
- afs_int32 fd, code = 0;
+ afs_int32 code = 0;
+ FD_t fd;
namei_t name;
FdHandle_t *fdP;
struct afs_stat tstat;
if (!fdP)
return EIO;
afs_snprintf(path, sizeof(path), "%s-tmp", name.n_path);
- fd = afs_open(path, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0);
- if (fd < 0) {
+ fd = OS_OPEN(path, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0);
+ if (fd == INVALID_FD) {
FDH_CLOSE(fdP);
return EIO;
}
buf = malloc(8192);
if (!buf) {
- close(fd);
+ OS_CLOSE(fd);
OS_UNLINK(path);
FDH_CLOSE(fdP);
return ENOMEM;
tlen = size > 8192 ? 8192 : size;
if (FDH_PREAD(fdP, buf, tlen, offset) != tlen)
break;
- if (write(fd, buf, tlen) != tlen)
+ if (OS_WRITE(fd, buf, tlen) != tlen)
break;
size -= tlen;
offset += tlen;
}
- close(fd);
+ OS_CLOSE(fd);
FDH_REALLYCLOSE(fdP);
free(buf);
if (size)
/* Open this handle */
(void)afs_snprintf(path2, sizeof(path2),
"%s" OS_DIRSEP "%s", path1, dname);
- linkHandle->fd_fd = afs_open(path2, Testing ? O_RDONLY : O_RDWR, 0666);
+ linkHandle->fd_fd = OS_OPEN(path2, Testing ? O_RDONLY : O_RDWR, 0666);
info.linkCount =
namei_GetLinkCount(linkHandle, (Inode) 0, 1, 1, Testing);
}
/**
* examine a namei file.
*
- * @param[in] path1 volume special directory path
+ * @param[in] path3 volume special directory path
* @param[in] dname directory entry name
* @param[in] myIH inode handle to volume directory
* @param[in] linkHandle namei link count fd handle.
int ret = 0;
struct ViceInodeInfo info;
#ifdef DELETE_ZLC
- int i; /* Windows-only (one level hash dir) */
+ int dirl; /* Windows-only (one level hash dir) */
#endif
if (DecodeInode(path3, dname, &info, myIH->ih_vid) < 0) {
/* defer -- the AddToZLCDeleteList() interface is not MT-safe */
ret = -2;
#else /* !AFS_SALSRV_ENV */
- AddToZLCDeleteList((char)i, dname);
+ dirl = path3[strlen(path3)-1];
+ AddToZLCDeleteList((char)dirl, dname);
#endif /* !AFS_SALSRV_ENV */
#else /* !DELETE_ZLC */
Log("Found 0 link count file %s" OS_DIRSEP "%s.\n", path3,
IHandle_t myIH = *dirIH;
namei_t name;
char path1[512], path3[512];
- DIR *dirp1, *dirp2, *dirp3;
+ DIR *dirp1, *dirp3;
#ifndef AFS_NT40_ENV
+ DIR *dirp2;
struct dirent *dp2;
char path2[512];
#endif
int wq_up = 0;
struct rx_queue resultlist;
#endif
-#ifdef DELETE_ZLC
- int i;
- static void AddToZLCDeleteList(char dir, char *name);
- static void DeleteZLCFiles(char *path);
-#endif
namei_HandleToVolDir(&name, &myIH);
strlcpy(path1, name.n_path, sizeof(path1));
dp2->d_name);
#else
/* Now we've got to the actual data */
- afs_snprintf(path3, sizeof(path3), "%s\\%s", path1,
+ afs_snprintf(path3, sizeof(path3), "%s" OS_DIRSEP "%s", path1,
dp1->d_name);
#endif
dirp3 = opendir(path3);
#ifdef AFS_SALSRV_ENV
if (error) {
closedir(dirp3);
+#ifndef AFS_NT40_ENV
closedir(dirp2);
+#endif
closedir(dirp1);
ret = -1;
goto error;
switch (code) {
case -1:
closedir(dirp3);
+#ifndef AFS_NT40_ENV
closedir(dirp2);
+#endif
closedir(dirp1);
ret = -1;
goto error;
FdHandle_t linkHandle;
char dirl;
- afs_snprintf(fpath, sizeof(fpath), "%s\\%s", dpath, name);
+ afs_snprintf(fpath, sizeof(fpath), "%s" OS_DIRSEP "%s", dpath, name);
dirH = FindFirstFileEx(fpath, FindExInfoStandard, &data,
FindExSearchNameMatch, NULL,
return -1;
*t = '\0';
- vno = base32_to_int(s);
+ vno = base32_to_int(s); /* type for special files */
tag = base32_to_int(t+1);
- info->inodeNumber = (Inode) tag << NAMEI_TAGSHIFT;
- info->inodeNumber |= (Inode) vno;
+ info->inodeNumber = ((Inode) tag) << NAMEI_TAGSHIFT;
+ info->inodeNumber |= vno;
info->byteCount = data.nFileSizeLow;
dirl = dpath[strlen(dpath)-1];
- if (dirl == 'R') { /* Special inode. */
+ if (dirl == NAMEI_SPECDIRC) { /* Special inode. */
info->inodeNumber |= NAMEI_INODESPECIAL;
info->u.param[0] = data.ftCreationTime.dwHighDateTime;
info->u.param[1] = data.ftCreationTime.dwLowDateTime;
- info->u.param[2] = tag;
+ info->u.param[2] = vno; /* type */
info->u.param[3] = volid;
- if (tag != VI_LINKTABLE)
+ if (vno != VI_LINKTABLE)
info->linkCount = 1;
else {
/* Open this handle */
char lpath[1024];
- (void)sprintf(lpath, "%s\\%s", fpath, data.cFileName);
- linkHandle.fd_fd = nt_open(lpath, O_RDONLY, 0666);
+ (void)sprintf(lpath, "%s" OS_DIRSEP "%s", fpath, data.cFileName);
+ linkHandle.fd_fd = OS_OPEN(lpath, O_RDONLY, 0666);
info->linkCount =
namei_GetLinkCount(&linkHandle, (Inode) 0, 0, 0, 0);
}
namei_GetLinkCount(&linkHandle, info->inodeNumber, 0, 0, 0);
if (info->linkCount == 0) {
#ifdef DELETE_ZLC
- Log("Found 0 link count file %s\\%s, deleting it.\n",
+ Log("Found 0 link count file %s" OS_DIRSEP "%s, deleting it.\n",
fpath, data.cFileName);
AddToZLCDeleteList(dirl, data.cFileName);
#else
- Log("Found 0 link count file %s\\%s.\n", path,
+ Log("Found 0 link count file %s" OS_DIRSEP "%s.\n", path,
data.cFileName);
#endif
} else {
struct VolumeDiskData vd;
char *p;
- if (OS_READ(fdr, (char *)&vd, sizeof(struct VolumeDiskData)) !=
+ if (OS_READ(fdr, &vd, sizeof(struct VolumeDiskData)) !=
sizeof(struct VolumeDiskData)) {
Log("1 convertVolumeInfo: read failed for %lu with code %d\n",
afs_printable_uint32_lu(vid),
vd.inUse = 0;
vd.uniquifier += 5000; /* just in case there are still file copies from
* the old RW volume around */
+
+ /* For ROs, the copyDate contains the time that the RO volume was actually
+ * created, and the creationDate just contains the last time the RO was
+ * copied from the RW data. So, make the new RW creationDate more accurate
+ * by setting it to copyDate, if copyDate is older. Since, we know the
+ * volume is at least as old as copyDate. */
+ if (vd.copyDate < vd.creationDate) {
+ vd.creationDate = vd.copyDate;
+ } else {
+ /* If copyDate is newer, just make copyDate and creationDate the same,
+ * for consistency with other RWs */
+ vd.copyDate = vd.creationDate;
+ }
+
p = strrchr(vd.name, '.');
if (p && !strcmp(p, ".readonly")) {
memset(p, 0, 9);
}
- if (OS_WRITE(fdw, (char *)&vd, sizeof(struct VolumeDiskData)) !=
+ if (OS_WRITE(fdw, &vd, sizeof(struct VolumeDiskData)) !=
sizeof(struct VolumeDiskData)) {
Log("1 convertVolumeInfo: write failed for %lu with code %d\n",
afs_printable_uint32_lu(vid),
(void)afs_snprintf(oldpath, sizeof oldpath, "%s" OS_DIRSEP "%s", dir_name,
infoName);
- fd = afs_open(oldpath, O_RDWR, 0);
- if (fd < 0) {
+ fd = OS_OPEN(oldpath, O_RDWR, 0);
+ if (fd == INVALID_FD) {
Log("1 namei_ConvertROtoRWvolume: could not open RO info file: %s\n",
oldpath);
code = -1;
}
t_ih.ih_ino = namei_MakeSpecIno(ih->ih_vid, VI_VOLINFO);
namei_HandleToName(&n, &t_ih);
- fd2 = afs_open(n.n_path, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0);
- if (fd2 < 0) {
+ fd2 = OS_OPEN(n.n_path, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0);
+ if (fd2 == INVALID_FD) {
Log("1 namei_ConvertROtoRWvolume: could not create RW info file: %s\n", n.n_path);
OS_CLOSE(fd);
code = -1;
namei_HandleToName(&n, &t_ih);
(void)afs_snprintf(newpath, sizeof newpath, "%s" OS_DIRSEP "%s", dir_name,
smallName);
- fd = afs_open(newpath, O_RDWR, 0);
- if (fd < 0) {
+ fd = OS_OPEN(newpath, O_RDWR, 0);
+ if (fd == INVALID_FD) {
Log("1 namei_ConvertROtoRWvolume: could not open SmallIndex file: %s\n", newpath);
code = -1;
goto done;
namei_HandleToName(&n, &t_ih);
(void)afs_snprintf(newpath, sizeof newpath, "%s" OS_DIRSEP "%s", dir_name,
largeName);
- fd = afs_open(newpath, O_RDWR, 0);
- if (fd < 0) {
+ fd = OS_OPEN(newpath, O_RDWR, 0);
+ if (fd == INVALID_FD) {
Log("1 namei_ConvertROtoRWvolume: could not open LargeIndex file: %s\n", newpath);
code = -1;
goto done;
}
if (dir)
- (void)sprintf(zlcCur->zlc_names[zlcCur->zlc_n], "%c\\%s", dir, name);
+ (void)sprintf(zlcCur->zlc_names[zlcCur->zlc_n], "%c" OS_DIRSEP "%s", dir, name);
else
(void)sprintf(zlcCur->zlc_names[zlcCur->zlc_n], "%s", name);
for (z = zlcAnchor; z; z = z->zlc_next) {
for (i = 0; i < z->zlc_n; i++) {
if (path)
- (void)sprintf(fname, "%s\\%s", path, z->zlc_names[i]);
+ (void)sprintf(fname, "%s" OS_DIRSEP "%s", path, z->zlc_names[i]);
else
(void)sprintf(fname, "%s", z->zlc_names[i]);
if (namei_unlink(fname) < 0) {