#include <roken.h>
+
#ifdef AFS_NAMEI_ENV
-#include <stdio.h>
-#include <stdlib.h>
-#ifndef AFS_NT40_ENV
-#include <unistd.h>
-#else
+
+#ifdef HAVE_SYS_FILE_H
+# include <sys/file.h>
+#endif
+
+#ifdef AFS_NT40_ENV
#define DELETE_ZLC
-#include <io.h>
#include <windows.h>
#include <winnt.h>
#include <winbase.h>
-#include <winsock2.h>
-#endif
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#ifdef AFS_NT40_ENV
#include <direct.h>
-#else
-#include <sys/file.h>
-#include <sys/param.h>
#endif
-#include <dirent.h>
-#include <afs/afs_assert.h>
-#include <string.h>
+
#include <lock.h>
#include <afs/afsutil.h>
#include <lwp.h>
#include "volume_inline.h"
#include "common.h"
#include <afs/errors.h>
-#ifdef AFS_NT40_ENV
-#include <afs/errmap_nt.h>
-#endif
-/*@+fcnmacros +macrofcndecl@*/
-#ifdef O_LARGEFILE
-#ifdef S_SPLINT_S
-#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
+#include <afs/errmap_nt.h>
#endif
-#define afs_fopen fopen
-#endif /* !O_LARGEFILE */
-/*@=fcnmacros =macrofcndecl@*/
#ifndef LOCK_SH
#define LOCK_SH 1 /* shared lock */
#include <vol/vol-salvage.h>
#endif
-#if !defined(HAVE_FLOCK) && !defined(AFS_NT40_ENV)
-#include <fcntl.h>
-
-/*
- * This function emulates a subset of flock()
- */
-int
-emul_flock(int fd, int cmd)
-{ struct flock f;
-
- memset(&f, 0, sizeof (f));
-
- if (cmd & LOCK_UN)
- f.l_type = F_UNLCK;
- if (cmd & LOCK_SH)
- f.l_type = F_RDLCK;
- if (cmd & LOCK_EX)
- f.l_type = F_WRLCK;
-
- return fcntl(fd, (cmd & LOCK_NB) ? F_SETLK : F_SETLKW, &f);
-}
-
-#define flock(f,c) emul_flock(f,c)
-#endif
-
int Testing=0;
return -1;
nBytes = FDH_PREAD(fdP, buf, size, offset);
- FDH_CLOSE(fdP);
+ if (nBytes < 0)
+ FDH_REALLYCLOSE(fdP);
+ else
+ FDH_CLOSE(fdP);
return nBytes;
}
return -1;
nBytes = FDH_PWRITE(fdP, buf, size, offset);
- FDH_CLOSE(fdP);
+ if (nBytes < 0)
+ FDH_REALLYCLOSE(fdP);
+ else
+ FDH_CLOSE(fdP);
return nBytes;
}
-
-
#ifdef AFS_NT40_ENV
/* Inode number format:
* low 32 bits - if a regular file or directory, the vnode; else the type.
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';
int fd;
/* Create the inode directory if we're starting for the first time */
- (void)afs_snprintf(filename, sizeof filename, "%s" OS_DIRSEP "%s", partition,
- INODEDIR);
+ snprintf(filename, sizeof filename, "%s" OS_DIRSEP "%s", partition,
+ INODEDIR);
mkdir(filename, 0700);
- (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);
+ snprintf(filename, sizeof filename,
+ "%s" OS_DIRSEP "%s" OS_DIRSEP "README",
+ partition, INODEDIR);
+ 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" OS_DIRSEP "%s", name->n_drive, name->n_voldir);
+ snprintf(tmp, 256, "%s" OS_DIRSEP "%s", name->n_drive, name->n_voldir);
if (mkdir(tmp) < 0) {
if (errno != EEXIST)
*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;
char tmp[256];
int i;
- afs_snprintf(tmp, 256, "%s" OS_DIRSEP "%s", name->n_drive, name->n_voldir);
+ snprintf(tmp, 256, "%s" OS_DIRSEP "%s", name->n_drive, name->n_voldir);
path = tmp;
path += strlen(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;
}
static int
-CheckOGM(namei_t *name, FdHandle_t *fdP, int p1)
+SetWinOGM(FD_t fd, int p1, int p2)
{
- WIN32_FIND_DATA info;
- HANDLE dirH;
+ BOOL code;
+ FILETIME ftime;
+
+ ftime.dwHighDateTime = p1;
+ ftime.dwLowDateTime = p2;
+
+ code = SetFileTime(fd, &ftime, NULL /*access*/, NULL /*write*/);
+ if (!code)
+ return -1;
+ return 0;
+}
+
+static int
+GetWinOGM(FD_t fd, int *p1, int *p2)
+{
+ BOOL code;
+ FILETIME ftime;
- dirH =
- FindFirstFileEx(name->n_path, FindExInfoStandard, &info,
- FindExSearchNameMatch, NULL,
- FIND_FIRST_EX_CASE_SENSITIVE);
+ code = GetFileTime(fd, &ftime, NULL /*access*/, NULL /*write*/);
+ if (!code)
+ return -1;
- if (!dirH)
- return -1; /* Can't get info, leave alone */
+ *p1 = ftime.dwHighDateTime;
+ *p2 = ftime.dwLowDateTime;
- FindClose(dirH);
+ return 0;
+}
+
+static int
+CheckOGM(FdHandle_t *fdP, int p1)
+{
+ int ogm_p1, ogm_p2;
+
+ if (GetWinOGM(fdP->fd_fd, &ogm_p1, &ogm_p2)) {
+ return -1;
+ }
- if (info.ftCreationTime.dwHighDateTime != (unsigned int)p1)
+ if (ogm_p1 != p1) {
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)
+GetOGMFromStat(struct afs_stat_st *status, int *parm, int *tag)
{
*parm = status->st_uid | (status->st_gid << 15);
*parm |= (status->st_mode & 0x18) << 27;
}
static int
-CheckOGM(namei_t *name, FdHandle_t *fdP, int p1)
+GetOGM(FdHandle_t *fdP, int *parm, int *tag)
{
- struct afs_stat status;
- int parm, tag;
+ struct afs_stat_st status;
if (afs_fstat(fdP->fd_fd, &status) < 0)
return -1;
+ GetOGMFromStat(&status, parm, tag);
+ return 0;
+}
- GetOGMFromStat(&status, &parm, &tag);
+static int
+CheckOGM(FdHandle_t *fdP, int p1)
+{
+ int parm, tag;
+
+ if (GetOGM(fdP, &parm, &tag) < 0)
+ return -1;
if (parm != p1)
return -1;
IHandle_t tmp;
FdHandle_t *fdP;
FdHandle_t tfd;
- int tag, i;
- FILETIME ftime;
+ int type, tag;
+ int ogm_p1, ogm_p2;
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;
+ ogm_p1 = p1;
+ ogm_p2 = p2;
+ type = p3;
tmp.ih_vid = p4; /* Use parent volume id, where this file will be. */
tmp.ih_ino = namei_MakeSpecIno(p1, p3);
} else {
tmp.ih_vid = p1;
tmp.ih_ino = (Inode) p2;
- ftime.dwHighDateTime = p3;
- ftime.dwLowDateTime = p4;
+ ogm_p1 = p3;
+ ogm_p2 = p4;
}
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_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_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 (SetWinOGM(fd, ogm_p1, ogm_p2)) {
errno = OS_ERROR(EBADF);
code = -1;
}
}
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_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_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;
}
return -1;
}
- if (CheckOGM(&name, fdP, p1) < 0) {
+ if (CheckOGM(fdP, p1) < 0) {
FDH_REALLYCLOSE(fdP);
IH_RELEASE(tmp);
errno = OS_ERROR(EINVAL);
}
if (count > 0) {
- FDH_REALLYCLOSE(fdP);
+ FDH_CLOSE(fdP);
IH_RELEASE(tmp);
return 0;
}
/* Try to remove directory. If it fails, that's ok.
* Salvage will clean up.
*/
+ char *slash = strrchr(name.n_path, OS_DIRSEPC);
+ if (slash) {
+ /* avoid an rmdir() on the file we just unlinked */
+ *slash = '\0';
+ }
(void)namei_RemoveDataDirectories(&name);
}
}
} else {
IHandle_t *th;
IH_INIT(th, ih->ih_dev, ih->ih_vid, ino);
- Log("Warning: Lost ref on ihandle dev %d vid %d ino %" AFS_INT64_FMT "\n",
+ Log("Warning: Lost ref on ihandle dev %d vid %d ino %lld\n",
th->ih_dev, th->ih_vid, (afs_int64)th->ih_ino);
IH_RELEASE(th);
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;
+ struct afs_stat_st tstat;
afs_foff_t offset;
namei_HandleToName(&name, h);
fdP = IH_OPEN(h);
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) {
+ snprintf(path, sizeof(path), "%s-tmp", name.n_path);
+ fd = OS_OPEN(path, O_CREAT | O_EXCL | 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)
}
rc = FDH_PREAD(h, (char*)&row, sizeof(row), offset);
+ if (rc == -1)
+ goto bad_getLinkByte;
+
if ((rc == 0 || !((row >> index) & NAMEI_TAGMASK)) && fixup && nowrite)
return 1;
if (rc == 0 && fixup) {
if (FDH_PWRITE(fdP, (char *)&row, sizeof(row), offset) != sizeof(row)) {
goto badGetFreeTag;
}
- FDH_SYNC(fdP);
+ (void)FDH_SYNC(fdP);
FDH_UNLOCKFILE(fdP, offset);
- FDH_REALLYCLOSE(fdP);
+ FDH_CLOSE(fdP);
return col;
badGetFreeTag:
errno = OS_ERROR(EBADF);
goto bad_SetLinkCount;
}
- FDH_SYNC(fdP);
+ (void)FDH_SYNC(fdP);
nBytes = 0;
unsigned int volid);
static int DecodeVolumeName(char *name, unsigned int *vid);
static int namei_ListAFSSubDirs(IHandle_t * dirIH,
- int (*write_fun) (FILE *,
+ int (*write_fun) (FD_t,
struct ViceInodeInfo *,
- char *, char *), FILE * fp,
+ char *, char *), FD_t fp,
int (*judgeFun) (struct ViceInodeInfo *,
afs_uint32 vid, void *),
afs_uint32 singleVolumeNumber, void *rock);
* can use the same inode reading code.
*/
static int
-WriteInodeInfo(FILE * fp, struct ViceInodeInfo *info, char *dir, char *name)
+WriteInodeInfo(FD_t fp, struct ViceInodeInfo *info, char *dir, char *name)
{
size_t n;
- n = fwrite(info, sizeof(*info), 1, fp);
- return (n == 1) ? 0 : -2;
+ n = OS_WRITE(fp, info, sizeof(*info));
+ return (n == sizeof(*info)) ? 0 : -2;
}
void
VerifyDirPerms(char *path)
{
- struct afs_stat status;
+ struct afs_stat_st status;
if (afs_stat(path, &status) < 0) {
Log("Unable to stat %s. Please manually verify mode bits for this"
* for this.
*/
int
-ListViceInodes(char *devname, char *mountedOn, FILE *inodeFile,
+ListViceInodes(char *devname, char *mountedOn, FD_t inodeFile,
int (*judgeInode) (struct ViceInodeInfo * info, afs_uint32 vid, void *rock),
afs_uint32 singleVolumeNumber, int *forcep, int forceR, char *wpath,
void *rock)
{
int ninodes;
- struct afs_stat status;
*forcep = 0; /* no need to salvage until further notice */
namei_ListAFSFiles(mountedOn, WriteInodeInfo, inodeFile, judgeInode,
singleVolumeNumber, rock);
- if (!inodeFile)
+ if (inodeFile == INVALID_FD)
return ninodes;
if (ninodes < 0) {
return ninodes;
}
- if (fflush(inodeFile) == EOF) {
- Log("Unable to successfully flush inode file for %s\n", mountedOn);
- return -2;
- }
- if (fsync(fileno(inodeFile)) == -1) {
+ if (OS_SYNC(inodeFile) == -1) {
Log("Unable to successfully fsync inode file for %s\n", mountedOn);
return -2;
}
/*
* Paranoia: check that the file is really the right size
*/
- if (afs_fstat(fileno(inodeFile), &status) == -1) {
- Log("Unable to successfully stat inode file for %s\n", mountedOn);
- return -2;
- }
- if (status.st_size != ninodes * sizeof(struct ViceInodeInfo)) {
+ if (OS_SIZE(inodeFile) != ninodes * sizeof(struct ViceInodeInfo)) {
Log("Wrong size (%d instead of %lu) in inode file for %s\n",
- (int) status.st_size,
+ (int) OS_SIZE(inodeFile),
(long unsigned int) ninodes * sizeof(struct ViceInodeInfo),
mountedOn);
return -2;
*/
int
namei_ListAFSFiles(char *dev,
- int (*writeFun) (FILE *, struct ViceInodeInfo *, char *,
+ int (*writeFun) (FD_t, struct ViceInodeInfo *, char *,
char *),
- FILE * fp,
+ FD_t fp,
int (*judgeFun) (struct ViceInodeInfo *, afs_uint32, void *),
afs_uint32 singleVolumeNumber, void *rock)
{
#else
if (*dp1->d_name == '.')
continue;
- afs_snprintf(path2, sizeof(path2), "%s" OS_DIRSEP "%s", name.n_path,
- dp1->d_name);
+ snprintf(path2, sizeof(path2), "%s" OS_DIRSEP "%s", name.n_path,
+ dp1->d_name);
dirp2 = opendir(path2);
if (dirp2) {
while ((dp2 = readdir(dirp2))) {
char * dname,
IHandle_t * myIH,
FdHandle_t * linkHandle,
- int (*writeFun) (FILE *, struct ViceInodeInfo *, char *,
+ int (*writeFun) (FD_t, struct ViceInodeInfo *, char *,
char *),
- FILE * fp,
+ FD_t fp,
int (*judgeFun) (struct ViceInodeInfo *, afs_uint32, void *),
int singleVolumeNumber,
void *rock)
} else {
char path2[512];
/* 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);
+ snprintf(path2, sizeof(path2),
+ "%s" OS_DIRSEP "%s", path1, dname);
+ linkHandle->fd_fd = OS_OPEN(path2, Testing ? O_RDONLY : O_RDWR, 0666);
info.linkCount =
namei_GetLinkCount(linkHandle, (Inode) 0, 1, 1, Testing);
}
if (!judgeFun ||
(*judgeFun) (&info, singleVolumeNumber, rock)) {
- ret = 1;
- if ((*writeFun) (fp, &info, path1, dname) < 0) {
+ ret = (*writeFun) (fp, &info, path1, dname);
+ if (ret < 0) {
+ Log("_namei_examine_special: writeFun returned %d\n", ret);
ret = -1;
+ } else {
+ ret = 1;
}
}
char * dname,
IHandle_t * myIH,
FdHandle_t * linkHandle,
- int (*writeFun) (FILE *, struct ViceInodeInfo *, char *,
+ int (*writeFun) (FD_t, struct ViceInodeInfo *, char *,
char *),
- FILE * fp,
+ FD_t fp,
int (*judgeFun) (struct ViceInodeInfo *, afs_uint32, void *),
int singleVolumeNumber,
void *rock)
if (!judgeFun ||
(*judgeFun) (&info, singleVolumeNumber, rock)) {
- ret = 1;
- if ((*writeFun) (fp, &info, path3, dname) < 0) {
+ ret = (*writeFun) (fp, &info, path3, dname);
+ if (ret < 0) {
+ Log("_namei_examine_reg: writeFun returned %d\n", ret);
ret = -1;
+ } else {
+ ret = 1;
}
}
* inode, this will be pointed at the
* link table
*/
- FILE * fp; /**< file pointer for writeFun */
+ FD_t fp; /**< file pointer for writeFun */
/** function which will write inode metadata to fp */
- int (*writeFun) (FILE *, struct ViceInodeInfo *, char *, char *);
+ int (*writeFun) (FD_t, struct ViceInodeInfo *, char *, char *);
/** inode filter function */
int (*judgeFun) (struct ViceInodeInfo *, afs_uint32, void *);
*/
static int
namei_ListAFSSubDirs(IHandle_t * dirIH,
- int (*writeFun) (FILE *, struct ViceInodeInfo *, char *,
+ int (*writeFun) (FD_t, struct ViceInodeInfo *, char *,
char *),
- FILE * fp,
+ FD_t fp,
int (*judgeFun) (struct ViceInodeInfo *, afs_uint32, void *),
afs_uint32 singleVolumeNumber, void *rock)
{
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));
#ifndef AFS_NT40_ENV /* This level missing on Windows */
/* Now we've got a next level subdir. */
- afs_snprintf(path2, sizeof(path2), "%s" OS_DIRSEP "%s", path1, dp1->d_name);
+ snprintf(path2, sizeof(path2), "%s" OS_DIRSEP "%s",
+ path1, dp1->d_name);
dirp2 = opendir(path2);
if (dirp2) {
while ((dp2 = readdir(dirp2))) {
continue;
/* Now we've got to the actual data */
- afs_snprintf(path3, sizeof(path3), "%s" OS_DIRSEP "%s", path2,
- dp2->d_name);
+ snprintf(path3, sizeof(path3), "%s" OS_DIRSEP "%s",
+ path2, dp2->d_name);
#else
/* Now we've got to the actual data */
- afs_snprintf(path3, sizeof(path3), "%s" OS_DIRSEP "%s", path1,
- dp1->d_name);
+ snprintf(path3, sizeof(path3), "%s" OS_DIRSEP "%s",
+ path1, dp1->d_name);
#endif
dirp3 = opendir(path3);
if (dirp3) {
#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" OS_DIRSEP "%s", dpath, name);
+ 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" OS_DIRSEP "%s", fpath, data.cFileName);
- linkHandle.fd_fd = afs_open(lpath, O_RDONLY, 0666);
+ linkHandle.fd_fd = OS_OPEN(lpath, O_RDONLY, 0666);
info->linkCount =
namei_GetLinkCount(&linkHandle, (Inode) 0, 0, 0, 0);
}
unsigned int volid)
{
char fpath[512];
- struct afs_stat status;
+ struct afs_stat_st status;
int parm, tag;
lb64_string_t check;
- afs_snprintf(fpath, sizeof(fpath), "%s" OS_DIRSEP "%s", dpath, name);
+ snprintf(fpath, sizeof(fpath), "%s" OS_DIRSEP "%s", dpath, name);
if (afs_stat(fpath, &status) < 0) {
return -1;
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),
t_ih.ih_dev = ih->ih_dev;
t_ih.ih_vid = ih->ih_vid;
- (void)afs_snprintf(oldpath, sizeof oldpath, "%s" OS_DIRSEP "%s", dir_name,
- infoName);
- fd = afs_open(oldpath, O_RDWR, 0);
- if (fd < 0) {
+ snprintf(oldpath, sizeof oldpath, "%s" OS_DIRSEP "%s", dir_name,
+ infoName);
+ 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_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;
t_ih.ih_ino = namei_MakeSpecIno(ih->ih_vid, VI_SMALLINDEX);
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) {
+ snprintf(newpath, sizeof newpath, "%s" OS_DIRSEP "%s", dir_name,
+ smallName);
+ 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;
t_ih.ih_ino = namei_MakeSpecIno(ih->ih_vid, VI_LARGEINDEX);
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) {
+ snprintf(newpath, sizeof newpath, "%s" OS_DIRSEP "%s", dir_name,
+ largeName);
+ 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 (!s)
s = result;
- (void)afs_snprintf(s, sizeof(afs_ino_str_t), "%" AFS_UINT64_FMT, (afs_uintmax_t) ino);
+ snprintf(s, sizeof(afs_ino_str_t), "%llu", (afs_uintmax_t) ino);
return s;
}