}
#endif /* AFS_NAMEI_ENV */
+#if defined(AFS_NT40_ENV) || !defined(AFS_NAMEI_ENV)
+/* Unix namei implements its own more efficient IH_CREATE_INIT; this wrapper
+ * is for everyone else */
+IHandle_t *
+ih_icreate_init(IHandle_t *lh, int dev, char *part, Inode nearInode,
+ afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4)
+{
+ IHandle_t *ihP;
+ Inode ino = IH_CREATE(lh, dev, part, nearInode, p1, p2, p3, p4);
+ if (!VALID_INO(ino)) {
+ return NULL;
+ }
+ IH_INIT(ihP, dev, p1, ino);
+ return ihP;
+}
+#endif
+
afs_sfsize_t
ih_size(FD_t fd)
{
# define OS_DIRSEPC '/'
#endif
+#if defined(AFS_NT40_ENV) || !defined(AFS_NAMEI_ENV)
+# define IH_CREATE_INIT(H, D, P, N, P1, P2, P3, P4) \
+ ih_icreate_init(H, D, P, N, P1, P2, P3, P4)
+#endif
+
#ifdef AFS_NAMEI_ENV
# ifdef AFS_NT40_ENV
# endif /* !O_LARGEFILE */
# define OS_SYNC(FD) fsync(FD)
+# define IH_CREATE_INIT(H, D, P, N, P1, P2, P3, P4) \
+ namei_icreate_init(H, D, P, P1, P2, P3, P4)
/*@=fcnmacros =macrofcndecl@*/
# endif /* AFS_NT40_ENV */
}
#else /* !AFS_NT40_ENV */
Inode
-namei_icreate(IHandle_t * lh, char *part, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4)
+icreate(IHandle_t * lh, char *part, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
+ FD_t *afd, Inode *ainode)
{
namei_t name;
int fd = INVALID_FD;
}
bad:
- if (fd != INVALID_FD)
- OS_CLOSE(fd);
-
-
if (code || (fd == INVALID_FD)) {
if (p2 != -1) {
fdP = IH_OPEN(lh);
}
}
}
- return (code || (fd == INVALID_FD)) ? (Inode) - 1 : tmp.ih_ino;
+
+ *afd = fd;
+ *ainode = tmp.ih_ino;
+
+ return code;
+}
+
+Inode
+namei_icreate(IHandle_t * lh, char *part,
+ afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4)
+{
+ Inode ino = 0;
+ int fd = INVALID_FD;
+ int code;
+
+ code = icreate(lh, part, p1, p2, p3, p4, &fd, &ino);
+ if (fd != INVALID_FD) {
+ close(fd);
+ }
+ return (code || (fd == INVALID_FD)) ? (Inode) - 1 : ino;
+}
+
+IHandle_t *
+namei_icreate_init(IHandle_t * lh, int dev, char *part,
+ afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4)
+{
+ Inode ino = 0;
+ int fd = INVALID_FD;
+ int code;
+ IHandle_t *ihP;
+ FdHandle_t *fdP;
+
+ code = icreate(lh, part, p1, p2, p3, p4, &fd, &ino);
+ if (fd == INVALID_FD) {
+ return NULL;
+ }
+ if (code) {
+ close(fd);
+ return NULL;
+ }
+
+ IH_INIT(ihP, dev, p1, ino);
+ fdP = ih_attachfd(ihP, fd);
+ if (!fdP) {
+ close(fd);
+ } else {
+ FDH_CLOSE(fdP);
+ }
+
+ return ihP;
}
#endif
extern Inode namei_MakeSpecIno(VolumeId volid, int type);
extern Inode namei_icreate(IHandle_t * lh, char *part, afs_uint32 p1,
afs_uint32 p2, afs_uint32 p3, afs_uint32 p4);
+extern IHandle_t *namei_icreate_init(IHandle_t *lh, int dev, char *part,
+ afs_uint32 p1, afs_uint32 p2,
+ afs_uint32 p3, afs_uint32 p4);
extern FD_t namei_iopen(IHandle_t * h);
extern int namei_irelease(IHandle_t * h);
afs_sfsize_t namei_iread(IHandle_t * h, afs_foff_t offset, char *buf,