From e3f9fcdeaaf35363c0b3d3a8004892aa4ce9233f Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 19 Mar 2008 13:57:36 +0000 Subject: [PATCH] windows-remove-umich-afsifs-20080319 LICENSE MIT The UMich AFS IFS code has never been made ready for production. An alternative approach is currently being worked on that will be. --- src/WINNT/afsd/NTMakefile | 7 - src/WINNT/afsd/afsdifs.c | 1154 ---------------------------------- src/WINNT/afsd/afsdifs.h | 33 - src/WINNT/afsd/cm_callback.c | 1 - src/WINNT/afsd/cm_ioctl.c | 1 - src/sys/pioctl_nt.c | 1 - 6 files changed, 1197 deletions(-) delete mode 100644 src/WINNT/afsd/afsdifs.c delete mode 100644 src/WINNT/afsd/afsdifs.h diff --git a/src/WINNT/afsd/NTMakefile b/src/WINNT/afsd/NTMakefile index bceb85506..9beb79ea0 100644 --- a/src/WINNT/afsd/NTMakefile +++ b/src/WINNT/afsd/NTMakefile @@ -89,15 +89,8 @@ $(RXOBJS): $(RX)\$$(@B).c $(IDLFILES):afsrpc.idl midl $(MIDL_FLAGS) $(AFSDEV_AUXMIDLFLAGS) /app_config $? -RPCOBJS = $(OUT)\ifs_rpc.obj - -$(RPCOBJS):..\afsrdr\ifs_rpc.c - $(C2OBJ) ..\afsrdr\ifs_rpc.c - AFSDOBJS=\ - $(OUT)\ifs_rpc.obj \ $(OUT)\rawops.obj \ - $(OUT)\afsdifs.obj \ $(OUT)\afsd_init.obj \ $(OUT)\cm_btree.obj \ $(OUT)\cm_cell.obj \ diff --git a/src/WINNT/afsd/afsdifs.c b/src/WINNT/afsd/afsdifs.c deleted file mode 100644 index 9d8c3df8d..000000000 --- a/src/WINNT/afsd/afsdifs.c +++ /dev/null @@ -1,1154 +0,0 @@ -/* copyright (c) 2005 - * the regents of the university of michigan - * all rights reserved - * - * permission is granted to use, copy, create derivative works and - * redistribute this software and such derivative works for any purpose, - * so long as the name of the university of michigan is not used in - * any advertising or publicity pertaining to the use or distribution - * of this software without specific, written prior authorization. if - * the above copyright notice or any other identification of the - * university of michigan is included in any copy of any portion of - * this software, then the disclaimer below must also be included. - * - * this software is provided as is, without representation from the - * university of michigan as to its fitness for any purpose, and without - * warranty by the university of michigan of any kind, either express - * or implied, including without limitation the implied warranties of - * merchantability and fitness for a particular purpose. the regents - * of the university of michigan shall not be liable for any damages, - * including special, indirect, incidental, or consequential damages, - * with respect to any claim arising out or in connection with the use - * of the software, even if it has been or is hereafter advised of the - * possibility of such damages. - */ - -#include -#include "afsd.h" -#include -#include "..\afsrdr\kif.h" -#include "..\afsrdr\ifs_rpc.h" - -#include "afsdifs.h" - - -/****************************/ -/* parameters, macros, etc. */ -/****************************/ -#define IFSL_SUCCEEDED(st) (!(st & IFSL_FAIL_BASE)) -#define MAP_RETURN(code) if (code) return ifs_MapCmError(code); -#define ROOTPATH "\\" -#define TRANSFER_BUF_SIZE (RPC_BUF_SIZE + TRANSFER_CHUNK_SIZE) -#define SCPL_LOCK EnterCriticalSection(&scp_list_lock); -#define SCPL_UNLOCK LeaveCriticalSection(&scp_list_lock); - - -/****************************/ -/* structs */ -/****************************/ -struct user_map_entry /* how we keep users straight. total of MAX_AFS_USERS of these */ -{ - LARGE_INTEGER id; /* internal id created by kernel */ - cm_user_t *creds; /* global (thread-specific) var userp is set to this */ -}; - -struct scp_status /* one for each unique file in afs */ -{ - struct scp_status *next; /* stored in a global chain in a chain locked by SCPL_[UN]LOCK */ - cm_scache_t *scp; /* file handle used with cm_ fns */ - ULONG fid; /* internal id generated by FID_HASH_FN from AFS's 128-bit FID */ -}; -typedef struct scp_status scp_status_t; - -struct readdir_context /* temporary struct, allocated as necessary, for cm_Apply callback */ -{ - char *matchString; /* for matching against */ - char *buf, *buf_pos; /* filling buffer to length, currently at buf_pos */ - ULONG_PTR length; - ULONG count; /* number of entries packed so far */ -}; -typedef struct readdir_context readdir_context_t; - - -/****************************/ -/* global vars */ -/****************************/ -/* the table user_map is used to store cm_user structs keyed on the calling - * process' 64-bit ID token. the rpc library sets userp to point to this - * entry; userp is specific to each thread, and thus may be used securely - * as a global. - */ -__declspec(thread) cm_user_t *userp; -struct user_map_entry user_map[MAX_AFS_USERS]; - -CRITICAL_SECTION mapLock, scp_list_lock; - -scp_status_t *scp_list_head = NULL; - - -/****************************/ -/* error functions */ -/****************************/ -char *IfslErrorToText(unsigned long ifsl) -{ - switch (ifsl) - { - case IFSL_SUCCESS: - return "success"; - case IFSL_DOES_NOT_EXIST: - return "does not exist"; - case IFSL_NOT_IMPLEMENTED: - return "not implemented"; - case IFSL_END_OF_ENUM: - return "end of enum"; - case IFSL_CANNOT_MAKE: - return "cannot make"; - case IFSL_END_OF_FILE: - return "end of file"; - case IFSL_NO_ACCESS: - return "no access"; - case IFSL_BUFFER_TOO_SMALL: - return "buffer too small"; - case IFSL_SHARING_VIOLATION: - return "sharing violation"; - case IFSL_BAD_INPUT: - return "bad input"; - case IFSL_GENERIC_FAILURE: - return "generic failure"; - case IFSL_OPEN_CREATED: - return "open created"; - case IFSL_OPEN_EXISTS: - return "open exists"; - case IFSL_OPEN_OPENED: - return "opened"; - case IFSL_OPEN_OVERWRITTEN: - return "overwritten"; - case IFSL_OPEN_SUPERSCEDED: - return "supersceded"; - case IFSL_BADFILENAME: - return "bad filename"; - case IFSL_READONLY: - return "read only"; - case IFSL_IS_A_DIR: - return "is a dir"; - case IFSL_PATH_DOES_NOT_EXIST: - return "path does not exist"; - case IFSL_IS_A_FILE: - return "is a file"; - case IFSL_NOT_EMPTY: - return "dir not empty"; - case IFSL_UNSPEC: - return "unspecified error"; - default: - return "NOT FOUND"; - } -} - -unsigned long ifs_MapCmError(unsigned long code) -{ - switch (code) - { - case CM_ERROR_STOPNOW: - case 0: - return IFSL_SUCCESS; - case CM_ERROR_NOSUCHCELL: - case CM_ERROR_NOSUCHVOLUME: - case CM_ERROR_NOSUCHFILE: - return IFSL_DOES_NOT_EXIST; - case CM_ERROR_NOSUCHPATH: - return IFSL_PATH_DOES_NOT_EXIST; - case CM_ERROR_BADNTFILENAME: - return IFSL_BADFILENAME; - case CM_ERROR_TIMEDOUT: - case CM_ERROR_ALLOFFLINE: - case CM_ERROR_CLOCKSKEW: - case CM_ERROR_REMOTECONN: - case CM_ERROR_ALLBUSY: - return IFSL_GENERIC_FAILURE; - case CM_ERROR_NOACCESS: - return IFSL_NO_ACCESS; - case CM_ERROR_RETRY: - case CM_ERROR_TOOBIG: - case CM_ERROR_BADFD: - case CM_ERROR_BADFDOP: - case CM_ERROR_CROSSDEVLINK: - return IFSL_GENERIC_FAILURE; - case CM_ERROR_EXISTS: - return IFSL_OPEN_EXISTS; - case CM_ERROR_BADOP: - case CM_ERROR_INVAL: - case CM_ERROR_UNKNOWN: - case CM_ERROR_BADSMB: - return IFSL_GENERIC_FAILURE; - case CM_ERROR_NOTDIR: - case CM_ERROR_ISDIR: - case CM_ERROR_READONLY: - return IFSL_BAD_INPUT; - case CM_ERROR_BUFFERTOOSMALL: - return IFSL_BUFFER_TOO_SMALL; - case CM_ERROR_WOULDBLOCK: - case CM_ERROR_BADSHARENAME: - case CM_ERROR_NOMORETOKENS: - case CM_ERROR_NOTEMPTY: - case CM_ERROR_USESTD: - case CM_ERROR_ATSYS: - return IFSL_GENERIC_FAILURE; - case CM_ERROR_NOFILES: - case CM_ERROR_BADTID: - return IFSL_END_OF_ENUM; - case CM_ERROR_PARTIALWRITE: - case CM_ERROR_NOIPC: - case CM_ERROR_RENAME_IDENTICAL: - case CM_ERROR_AMBIGUOUS_FILENAME: - return IFSL_GENERIC_FAILURE; - case IFSL_SHARING_VIOLATION: - return IFSL_SHARING_VIOLATION; - case IFSL_NOT_EMPTY: - return IFSL_NOT_EMPTY; - case CM_ERROR_SPACE: - case CM_ERROR_QUOTA: - return IFSL_OVERQUOTA; - } - return IFSL_GENERIC_FAILURE; -} - - -/****************************/ -/* support fns */ -/****************************/ -cm_scache_t *ifs_FindScp(ULONG fid) /* walk list to find scp<->fid mapping */ -{ - scp_status_t *curr; - - SCPL_LOCK; - - curr = scp_list_head; - while (curr) - { - if (curr->fid == fid) - { - SCPL_UNLOCK; - return curr->scp; - } - curr = curr->next; - } - SCPL_UNLOCK; - return NULL; -} - -/* must call with scp write-locked. will always return correct results - unless network fails (it loops properly). */ -ifs_CheckAcl(cm_scache_t *scp, ULONG access, ULONG *granted) -{ - long code; - cm_req_t req; - - cm_InitReq(&req); - - /* ripped from cm_scache.c */ - while (1) - { - if (cm_HaveAccessRights(scp, userp, access, granted)) - { - return 0; - } - else - { - /* we don't know the required access rights */ - code = cm_GetAccessRights(scp, userp, &req); - MAP_RETURN(code); - continue; - } - } - - return 0; -} - -/* extract data from scp. an ifs_ support function to centralize changes. */ -ifs_CopyInfo(cm_scache_t *scp, ULONG *attribs, LARGE_INTEGER *size, - LARGE_INTEGER *creation, LARGE_INTEGER *access, - LARGE_INTEGER *change, LARGE_INTEGER *written) -{ - access->QuadPart = 0; /* these mappings are not quite correct. we can */ - change->QuadPart = scp->clientModTime; /* leave them zero, if necessary. */ - written->QuadPart = scp->clientModTime; - creation->QuadPart = scp->serverModTime; - - *attribs = 0; - if (scp->fileType == CM_SCACHETYPE_DIRECTORY || - scp->fileType == CM_SCACHETYPE_SYMLINK || - scp->fileType == CM_SCACHETYPE_MOUNTPOINT/* || - scp->fileType == 0*/) - *attribs |= FILE_ATTRIBUTE_DIRECTORY; - - /*if (!attribs && scp->fileType == CM_SCACHETYPE_FILE) - *attribs |= FILE_ATTRIBUTE_NORMAL;*/ - - if (*attribs == FILE_ATTRIBUTE_DIRECTORY) - size->QuadPart = 0; - else - *size = scp->length; - - return 0; -} - - -/* close and zero scp pointer. zeroing pointer should - help eliminate accessing discarded cache entries. */ -void ifs_InternalClose(cm_scache_t **scpp) -{ - osi_assert(scpp && *scpp); - cm_ReleaseSCache(*scpp); - *scpp = NULL; -} - -/* normalizes path by removing trailing slashes. separates last - * path component with a null, so that *dirp points to parent path - * and *filep points to filename. modifies string path. - */ -BOOLEAN ifs_FindComponents(char *path, const char **dirp, const char **filep) -{ - char *lastSep; - BOOLEAN removed; - static char emptyPath[] = "\\"; /* if the path contains only one component, this is the parent. */ - - osi_assert(path); - - if (strlen(path)) - removed = (path[strlen(path)-1] == '\\'); - else - removed = 1; - - lastSep = strrchr(path, '\\'); - while (lastSep == path + strlen(path) - 1) - { - *lastSep = '\0'; - lastSep = strrchr(path, '\\'); - } - - if (lastSep) - { - *lastSep = '\0'; - - *dirp = path; - *filep = lastSep + 1; - } - else - { - lastSep = path + strlen(path); - - *dirp = emptyPath; - *filep = path; - } - - return removed; -} - -/* here to make maintenance easy */ -unsigned long ifs_ConvertFileName(wchar_t *in, unsigned int inchars, char *out, unsigned int outchars) -{ - unsigned long code; - - code = WideCharToMultiByte(CP_UTF8, 0/*WC_NO_BEST_FIT_CHARS*/, in, inchars, out, outchars-1, NULL, NULL); - if (!code) - return IFSL_BADFILENAME; - - return 0; -} - -/* called by rpc_ library to let us initialize environment. - * call with id of zero to clear current thread auth. */ -ifs_ImpersonateClient(LARGE_INTEGER user_id) -{ - int x, empty; - - if (!user_id.QuadPart) - { - userp = NULL; - return 0; - } - - empty = -1; - EnterCriticalSection(&mapLock); - for (x = 0; x < MAX_AFS_USERS; x++) - { - if (user_map[x].id.QuadPart == 0) - empty = x; - if (user_map[x].id.QuadPart == user_id.QuadPart) - goto done; - } - if (empty == -1) - { - LeaveCriticalSection(&mapLock); - return -1; - } - user_map[empty].id = user_id; - user_map[empty].creds = cm_NewUser(); - x = empty; - - done: - userp = user_map[x].creds; - LeaveCriticalSection(&mapLock); - - return 0; -} - - -/****************************/ -/* upcalls */ -/****************************/ -long uc_namei(WCHAR *name, ULONG *fid) /* performs name<->fid mapping, and enters it into table */ -{ - char *buffer; /* we support semi-infinite path lengths */ - long code; - cm_scache_t *scp, *dscp; - char *dirp, *filep; - cm_req_t req; - scp_status_t *st; - short len; - - cm_InitReq(&req); - - len = (short)wcslen(name)+20; /* characters *should* map 1<->1, but in case */ - buffer = malloc(len); - code = ifs_ConvertFileName(name, -1, buffer, len); - if (code) - { - free(buffer); - MAP_RETURN(code); - } - ifs_FindComponents(buffer, &dirp, &filep); - - code = cm_NameI(cm_data.rootSCachep, dirp, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, userp, ROOTPATH, &req, &dscp); - if (code) - { - free(buffer); - MAP_RETURN(code); - } - if (*filep) - code = cm_Lookup(dscp, filep, 0, userp, &req, &scp); - else - cm_HoldSCache(scp = dscp); - cm_ReleaseSCache(dscp); - - if (code) - { - free(buffer); - MAP_RETURN(code); - } - - if (ifs_FindScp(FID_HASH_FN(&scp->fid))) - { - osi_assertx(ifs_FindScp(FID_HASH_FN(&scp->fid)) == scp, "uc_namei: same fid hash for two files"); - *fid = FID_HASH_FN(&scp->fid); - osi_assert(scp->refCount > 1); - cm_ReleaseSCache(scp); - } - else - { - SCPL_LOCK; - st = malloc(sizeof(scp_status_t)); - st->scp = scp; - st->fid = FID_HASH_FN(&scp->fid); - st->next = scp_list_head; - scp_list_head = st; - SCPL_UNLOCK; - osi_assert(scp->refCount == 1); - *fid = st->fid; - } - - free(buffer); - - return 0; -} - -/* this should only be called right after open, so we do not need to stat file. - * we only check the server's restrictions. sharing violations are handled in the - * kernel. the access mode we grant sticks with the file_object until its death. */ -long uc_check_access(ULONG fid, ULONG access, ULONG *granted) -{ - ULONG afs_acc, afs_gr; - cm_scache_t *scp; - ULONG gr; - BOOLEAN file, dir; - - gr = 0; - - scp = ifs_FindScp(fid); - if (!scp) - return IFSL_BAD_INPUT; - - file = (scp->fileType == CM_SCACHETYPE_FILE); - dir = !file; - - /* access definitions from prs_fs.h */ - afs_acc = 0; - if (access & FILE_READ_DATA) - afs_acc |= PRSFS_READ; - if (file && ((access & FILE_WRITE_DATA) || (access & FILE_APPEND_DATA))) - afs_acc |= PRSFS_WRITE; - if (access & FILE_WRITE_EA || access & FILE_WRITE_ATTRIBUTES) - afs_acc |= PRSFS_WRITE; - if (dir && ((access & FILE_ADD_FILE) || (access & FILE_ADD_SUBDIRECTORY))) - afs_acc |= PRSFS_INSERT; - if (dir && (access & FILE_LIST_DIRECTORY)) - afs_acc |= PRSFS_LOOKUP; - if (access & FILE_READ_EA || access & FILE_READ_ATTRIBUTES) - afs_acc |= PRSFS_LOOKUP; - if (file && (access & FILE_EXECUTE)) - afs_acc |= PRSFS_WRITE; - if (dir && (access & FILE_TRAVERSE)) - afs_acc |= PRSFS_READ; - if (dir && (access & FILE_DELETE_CHILD)) - afs_acc |= PRSFS_DELETE; - if ((access & DELETE)) - afs_acc |= PRSFS_DELETE; - - /* check ACL with server */ - lock_ObtainWrite(&scp->rw); - ifs_CheckAcl(scp, afs_acc, &afs_gr); - lock_ReleaseWrite(&scp->rw); - - *granted = 0; - if (afs_gr & PRSFS_READ) - *granted |= FILE_READ_DATA | FILE_EXECUTE; - if (afs_gr & PRSFS_WRITE) - *granted |= FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES | FILE_EXECUTE; - if (afs_gr & PRSFS_INSERT) - *granted |= (dir ? FILE_ADD_FILE | FILE_ADD_SUBDIRECTORY : 0) | (file ? FILE_ADD_SUBDIRECTORY : 0); - if (afs_gr & PRSFS_LOOKUP) - *granted |= (dir ? FILE_LIST_DIRECTORY : 0) | FILE_READ_EA | FILE_READ_ATTRIBUTES; - if (afs_gr & PRSFS_DELETE) - *granted |= FILE_DELETE_CHILD | DELETE; - if (afs_gr & PRSFS_LOCK) - *granted |= 0; - if (afs_gr & PRSFS_ADMINISTER) - *granted |= 0; - - * granted |= SYNCHRONIZE | READ_CONTROL; - - return 0; -} - -long uc_create(WCHAR *name, ULONG attribs, LARGE_INTEGER alloc, ULONG access, ULONG *granted, ULONG *fid) -{ - char *buffer; /* we support semi-infinite path lengths */ - long code; - cm_scache_t *scp, *dscp; - char *dirp, *filep; - unsigned char removed; - cm_req_t req; - scp_status_t *st; - cm_attr_t attr; - short len; - - cm_InitReq(&req); - - len = (short)wcslen(name)+20; /* characters *should* map 1<->1, but in case */ - buffer = malloc(len); - code = ifs_ConvertFileName(name, -1, buffer, len); - if (code) - { - free(buffer); - MAP_RETURN(code); - } - removed = ifs_FindComponents(buffer, &dirp, &filep); - - /* lookup the parent directory, which must exist */ - code = cm_NameI(cm_data.rootSCachep, dirp, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, userp, ROOTPATH, &req, &dscp); - if (code) - { - free(buffer); - MAP_RETURN(code); - } - - osi_assert(filep); - if (*filep) - { - attr.mask = CM_ATTRMASK_LENGTH; - attr.length = alloc; - - if (attribs & FILE_ATTRIBUTE_DIRECTORY) - { - code = cm_MakeDir(dscp, filep, 0, &attr, userp, &req); - if (!code) - code = cm_Lookup(dscp, filep, 0, userp, &req, &scp); - } - else - code = cm_Create(dscp, filep, 0, &attr, &scp, userp, &req); - } - cm_ReleaseSCache(dscp); - - if (code) - { - free(buffer); - MAP_RETURN(code); - } - - SCPL_LOCK; - st = malloc(sizeof(scp_status_t)); - st->scp = scp; - st->fid = FID_HASH_FN(&scp->fid); - st->next = scp_list_head; - scp_list_head = st; - SCPL_UNLOCK; - - *fid = st->fid; - *granted = access; - - free(buffer); - - return 0; -} - -/* this does not fill the attribs member completely. additional flags must - be added in the kernel, such as read-only. */ -long uc_stat(ULONG fid, ULONG *attribs, LARGE_INTEGER *size, LARGE_INTEGER *creation, - LARGE_INTEGER *access, LARGE_INTEGER *change, LARGE_INTEGER *written) -{ - cm_scache_t *scp; - cm_req_t req; - ULONG code; - - scp = ifs_FindScp(fid); - if (!scp) - return IFSL_BAD_INPUT; - - /* stat file; don't want callback */ - cm_InitReq(&req); - lock_ObtainWrite(&(scp->rw)); - cm_HoldUser(userp); - code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_GETSTATUS); - cm_ReleaseUser(userp); - - if (code) - lock_ReleaseWrite(&(scp->rw)); - MAP_RETURN(code); - - code = ifs_CopyInfo(scp, attribs, size, creation, access, change, written); - lock_ReleaseWrite(&(scp->rw)); - MAP_RETURN(code); - - return 0; -} - -/* set atime, mtime, etc. */ -long uc_setinfo(ULONG fid, ULONG attribs, LARGE_INTEGER creation, LARGE_INTEGER access, - LARGE_INTEGER change, LARGE_INTEGER written) -{ - return IFSL_GENERIC_FAILURE; -} - -/* FIXFIX: this code may not catch over-quota errors, because the end - * of the file is not written to the server by the time this returns. */ -/* truncate or extend file, in cache and on server */ -long uc_trunc(ULONG fid, LARGE_INTEGER size) -{ - ULONG code; - cm_scache_t *scp; - cm_req_t req; - osi_hyper_t oldLen; - - scp = ifs_FindScp(fid); - if (!scp) - return IFSL_BAD_INPUT; - - /* we have already checked permissions in the kernel; but, if we do not - * have access as this userp, code will fail in rpc layer. - */ - - cm_InitReq(&req); - lock_ObtainWrite(&(scp->rw)); - - code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_GETSTATUS); - - if (code) - lock_ReleaseWrite(&(scp->rw)); - MAP_RETURN(code); - - oldLen = scp->length; - lock_ReleaseWrite(&(scp->rw)); - - code = cm_SetLength(scp, &size, userp, &req); - MAP_RETURN(code); - /*code = cm_FSync(scp, userp, &req); - MAP_RETURN(code);*/ - /*code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_GETSTATUS); - MAP_RETURN(code);*/ - -#if 0 - /* attempt to write last byte of file. fails to bring out quota errors because of delayed writing. */ - if (oldLen.QuadPart < size.QuadPart) - { - writePos.QuadPart = size.QuadPart - 1; - WriteData(scp, writePos, 1, &"\0\0\0", userp, &written); - MAP_RETURN(code); - if (written != 1) - return IFSL_UNSPEC; - } -#endif - - return 0; -} - -/* read data from a file */ -long uc_read(ULONG fid, LARGE_INTEGER offset, ULONG length, ULONG *read, char *data) -{ - ULONG code; - cm_scache_t *scp; - - *read = 0; - - scp = ifs_FindScp(fid); - if (!scp) - return IFSL_BAD_INPUT; - - if (scp->fileType == CM_SCACHETYPE_DIRECTORY) - return IFSL_IS_A_DIR; - - code = ReadData(scp, offset, (unsigned long)length, data, userp, read); - MAP_RETURN(code); - - return 0; -} - -/* FIXFIX: this does not catch all overquota errors, because the file - * is not necessarily written to the server when this returns. */ -/* write data to a file */ -long uc_write(ULONG fid, LARGE_INTEGER offset, ULONG length, ULONG *written, char *data) -{ - ULONG code; - cm_scache_t *scp; - - scp = ifs_FindScp(fid); - if (!scp) - return IFSL_BAD_INPUT; - - if (offset.QuadPart == -1) - offset = scp->length; - code = WriteData(scp, offset, (unsigned long)length, data, userp, written); - MAP_RETURN(code); - - return 0; -} - -long uc_rename(ULONG fid, WCHAR *curr, WCHAR *new_dir, WCHAR *new_name, ULONG *new_fid) -{ - int code; - cm_req_t req; - char *curdir, *curfile, *newdir, *newfile; - cm_scache_t *dscp1, *dscp2, *scp; - char b1[MAX_PATH], b2[MAX_PATH], b3[MAX_PATH]; - wchar_t b3_w[MAX_PATH]; - - code = !(scp = ifs_FindScp(fid)); - if (!code) - code = ifs_ConvertFileName(curr, -1, b1, MAX_PATH); - if (!code) - code = ifs_ConvertFileName(new_name, -1, b2, MAX_PATH); - if (!code) - code = ifs_ConvertFileName(new_dir, -1, b3, MAX_PATH); - if (!code) - { - ifs_FindComponents(b1, &curdir, &curfile); - ifs_FindComponents(b2, &newdir, &newfile); - newdir = b3; - uc_close(fid); - code = cm_NameI(cm_data.rootSCachep, curdir, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, userp, ROOTPATH, &req, &dscp1); - } - if (!code) - { - if (!strcmp(curdir, newdir)) - { - dscp2 = dscp1; - dscp1->refCount++; - } - else - code = cm_NameI(cm_data.rootSCachep, newdir, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, userp, ROOTPATH, &req, &dscp2); - if (!code) - { - code = cm_Rename(dscp1, curfile, dscp2, newfile, userp, &req); - if (!code) - { - strcat(b3, "\\"); - strcat(b3, b2); - mbstowcs(b3_w, b3, MAX_PATH); - uc_namei(b3_w, new_fid); - } - else - { - code = uc_namei(curr, new_fid); - } - ifs_InternalClose(&dscp2); - } - else - { - code = uc_namei(curr, new_fid); - } - ifs_InternalClose(&dscp1); - } - - MAP_RETURN(code); - return 0; -} - -uc_flush(ULONG fid) -{ - ULONG code; - cm_scache_t *scp; - cm_req_t req; - - scp = ifs_FindScp(fid); - if (!scp) - return IFSL_BAD_INPUT; - - cm_InitReq(&req); - code = cm_FSync(scp, userp, &req); - - MAP_RETURN(code); - return 0; -} - -ifs_ReaddirCallback(cm_scache_t *scp, cm_dirEntry_t *entry, void *param, osi_hyper_t *offset) -{ - readdir_context_t *context; - ULONG name_len; - readdir_data_t *info; - char short_name[14], *endp; - ULONG code; - cm_req_t req; - cm_scache_t *child_scp; - cm_fid_t child_fid; - int t; - - context = param; - - name_len = (ULONG) strlen(entry->name); - - info = (readdir_data_t *)context->buf_pos; - if (context->length - (context->buf_pos - context->buf) < sizeof(readdir_data_t) + name_len * sizeof(WCHAR) + sizeof(LARGE_INTEGER)) - { - if (context->count == 0) - return CM_ERROR_BUFFERTOOSMALL; - info->cookie = *offset; - return CM_ERROR_STOPNOW; - } - - if ((context->matchString && context->matchString[0] && (!strcmp(context->matchString, entry->name) || context->matchString[0]=='*')) || - !(context->matchString && context->matchString[0])) - ; - else - return 0; - - cm_InitReq(&req); - cm_HoldUser(userp); - child_scp = NULL; - - child_fid.cell = scp->fid.cell; - child_fid.volume = scp->fid.volume; - child_fid.vnode = ntohl(entry->fid.vnode); - child_fid.unique = ntohl(entry->fid.unique); - code = cm_GetSCache(&child_fid, &child_scp, userp, &req); - if (code || !child_scp) - { - cm_ReleaseUser(userp); - return 0; - } - - { - lock_ObtainWrite(&child_scp->rw); - code = cm_SyncOp(child_scp, NULL, userp, &req, 0, CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_NEEDCALLBACK); - lock_ReleaseWrite(&child_scp->rw); - } - - if (code) /* perhaps blank fields we do not know, and continue. bad filents should not prevent readdirs. */ - ; - - info->cookie = *offset; - - lock_ObtainWrite(&(child_scp->rw)); - code = ifs_CopyInfo(child_scp, &info->attribs, &info->size, &info->creation, &info->access, &info->change, &info->write); -#if 0 - /* make files we do not have write access to read-only */ - /* this is a handy feature, but it takes a lot of time and traffic to enumerate */ - ifs_CheckAcl(child_scp, FILE_WRITE_DATA, &gr); /* perhaps add flag to not loop, to avoid network traffic if not found*/ - if (gr & FILE_READ_DATA && !(gr & FILE_WRITE_DATA)) - info->attribs |= FILE_ATTRIBUTE_READONLY; -#endif - lock_ReleaseWrite(&(child_scp->rw)); - ifs_InternalClose(&child_scp); - MAP_RETURN(code); - - cm_Gen8Dot3Name(entry, short_name, &endp); - *endp = '\0'; - info->short_name_length = (CCHAR)sizeof(WCHAR)*((t=MultiByteToWideChar(CP_UTF8, 0, short_name, -1, info->short_name, 14))?t-1:0); - info->name_length = sizeof(WCHAR)*((t=MultiByteToWideChar(CP_UTF8, 0, entry->name, -1, info->name, 600))?t-1:0); - - context->buf_pos = ((char*)info) + sizeof(readdir_data_t) + info->name_length; - context->count++; - - info = (readdir_data_t *)context->buf_pos; - info->cookie.QuadPart = -1; - - return 0; -} - -long uc_readdir(ULONG fid, LARGE_INTEGER cookie_in, WCHAR *filter, ULONG *count, char *data, ULONG_PTR *len) -{ - ULONG code; - char buffer[2048]; - cm_req_t req; - cm_scache_t *scp; - readdir_context_t context; - LARGE_INTEGER cookie; - - if (cookie_in.QuadPart == -1) - { - *len = 0; - *count = 0; - return 0; - } - - scp = ifs_FindScp(fid); - if (!scp) - return IFSL_BAD_INPUT; - code = ifs_ConvertFileName(filter, -1, buffer, 2048); - if (code) - return code; - - cm_InitReq(&req); - cm_HoldUser(userp); - - cookie = cookie_in; - context.matchString = buffer; - context.buf_pos = context.buf = data; - context.length = *len; - context.count = 0; - *count = 0; - - ((LARGE_INTEGER *)context.buf)->QuadPart = -1; - - code = cm_ApplyDir(scp, ifs_ReaddirCallback, &context, &cookie, userp, &req, NULL); - - context.buf_pos += sizeof(LARGE_INTEGER); - - *count = context.count; - - cm_ReleaseUser(userp); - *len = context.buf_pos - context.buf; - - code = ifs_MapCmError(code); - return code; -} - -long uc_close(ULONG fid) -{ - cm_scache_t *scp; - cm_req_t req; - scp_status_t *prev, *curr; - - scp = ifs_FindScp(fid); - if (!scp) - return IFSL_BAD_INPUT; - - cm_InitReq(&req); - cm_FSync(scp, userp, &req); - - SCPL_LOCK; /* perhaps this should be earlier */ - - cm_ReleaseSCache(scp); - - prev = NULL, curr = scp_list_head; - - while (curr) - { - if (curr->fid == fid) - { - if (prev) - prev->next = curr->next; - else - scp_list_head = curr->next; - free(curr); - break; - } - prev = curr; - curr = curr->next; - } - - SCPL_UNLOCK; - - return 0; -} - -long uc_unlink(WCHAR *name) -{ - char buffer[2048]; - long code; - cm_scache_t *dscp; - char *dirp, *filep; - unsigned char removed; - cm_req_t req; - - cm_InitReq(&req); - - code = ifs_ConvertFileName(name, -1, buffer, 2048); - MAP_RETURN(code); - removed = ifs_FindComponents(buffer, &dirp, &filep); - - if (!(*filep)) - return IFSL_BADFILENAME; - - code = cm_NameI(cm_data.rootSCachep, dirp, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW | CM_FLAG_CHECKPATH, userp, ROOTPATH, &req, &dscp); - MAP_RETURN(code); - - code = cm_Unlink(dscp, filep, userp, &req); - if (code) - code = cm_RemoveDir(dscp, filep, userp, &req); - - cm_ReleaseSCache(dscp); - MAP_RETURN(code); - - return 0; -} - - -long uc_ioctl_write(ULONG length, char *data, ULONG_PTR *key) -{ - smb_ioctl_t *iop; - - iop = malloc(sizeof(smb_ioctl_t)); - memset(iop, 0, sizeof(smb_ioctl_t)); - smb_IoctlPrepareWrite(NULL, iop); - - memcpy(iop->inDatap + iop->inCopied, data, length); - iop->inCopied += length; - *key = (ULONG_PTR)iop; - - return 0; -} - -long uc_ioctl_read(ULONG_PTR key, ULONG *length, char *data) -{ - smb_ioctl_t *iop; - - iop = (smb_ioctl_t *)key; - osi_assert(iop); - - cm_HoldUser(userp); - smb_IoctlPrepareRead(NULL, iop, userp); - cm_ReleaseUser(userp); - - *length = iop->outDatap - iop->outAllocp; - memcpy(data, iop->outAllocp, *length); - free(iop); - - return 0; -} - -int ifs_Init(char **reason) -{ - HANDLE kcom; - - kcom = CreateFile("\\\\.\\afscom\\upcallhook", GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, - 0, NULL); - if (kcom == INVALID_HANDLE_VALUE) - { - *reason = "error creating communications file"; - return CM_ERROR_REMOTECONN; - } - CloseHandle(kcom); - - memset(user_map, 0, MAX_AFS_USERS*sizeof(struct user_map_entry)); - InitializeCriticalSection(&mapLock); - InitializeCriticalSection(&scp_list_lock); - - return 0; -} - -ifs_TransactRpc(char *outbuf, int outlen, char *inbuf, int *inlen) -{ - HANDLE hf; - DWORD read = 0; - DWORD inmax; - - if (!outbuf || !inbuf) - return IFSL_GENERIC_FAILURE; - - hf = CreateFile("\\\\.\\afscom\\downcall", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); - if (hf == INVALID_HANDLE_VALUE) - return 0; - - inmax = *inlen; - if (!DeviceIoControl(hf, IOCTL_AFSRDR_DOWNCALL, outbuf, outlen, inbuf, inmax, inlen, NULL)) - { - CloseHandle(hf); - return IFSL_GENERIC_FAILURE; - } - - CloseHandle(hf); - return inlen ? IFSL_SUCCESS : IFSL_GENERIC_FAILURE; -} - - -DWORD WINAPI ifs_MainLoop(LPVOID param) -{ - HANDLE pipe; - DWORD written; - unsigned char *bufIn, *bufOut; - DWORD lenIn; - rpc_t rpc; - BOOL st; - - bufIn = VirtualAlloc(NULL, TRANSFER_BUF_SIZE, MEM_COMMIT, PAGE_READWRITE); - bufOut = VirtualAlloc(NULL, TRANSFER_BUF_SIZE, MEM_COMMIT, PAGE_READWRITE); - if (!bufIn || !bufOut) - { - if (bufIn) VirtualFree(bufIn, 0, MEM_RELEASE); - if (bufOut) VirtualFree(bufOut, 0, MEM_RELEASE); - osi_panic("ifs: allocate transfer buffers", __FILE__, __LINE__); - } - - pipe = CreateFile("\\\\.\\afscom\\upcallhook", GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, - 0, NULL); - if (pipe == INVALID_HANDLE_VALUE) - { - VirtualFree(bufIn, 0, MEM_RELEASE); - VirtualFree(bufOut, 0, MEM_RELEASE); - osi_panic("ifs: creating communications handle", __FILE__, __LINE__); - } - - while (1) - { - /* just check if the event is already signalled, do not wait */ - if (WaitForSingleObject(WaitToTerminate, 0) == WAIT_OBJECT_0) - break; - - /* read request... */ - st = ReadFile(pipe, bufIn, TRANSFER_BUF_SIZE, &lenIn, NULL); - if (!st) { - if (GetLastError() == ERROR_INVALID_HANDLE) - break; - else - continue; - } - - ZeroMemory(&rpc, sizeof(rpc)); - rpc.in_buf = rpc.in_pos = bufIn; - rpc.out_buf = rpc.out_pos = bufOut; - - /* ...process it... */ - rpc_parse(&rpc); - - /* ...and write it back */ - st = WriteFile(pipe, rpc.out_buf, rpc.out_pos - rpc.out_buf, &written, NULL); - if (!st) - if (GetLastError() == ERROR_INVALID_HANDLE) - break; - else - continue; - } - - return (DWORD)1; -} diff --git a/src/WINNT/afsd/afsdifs.h b/src/WINNT/afsd/afsdifs.h deleted file mode 100644 index e18ef07f4..000000000 --- a/src/WINNT/afsd/afsdifs.h +++ /dev/null @@ -1,33 +0,0 @@ -/* copyright (c) 2005 - * the regents of the university of michigan - * all rights reserved - * - * permission is granted to use, copy, create derivative works and - * redistribute this software and such derivative works for any purpose, - * so long as the name of the university of michigan is not used in - * any advertising or publicity pertaining to the use or distribution - * of this software without specific, written prior authorization. if - * the above copyright notice or any other identification of the - * university of michigan is included in any copy of any portion of - * this software, then the disclaimer below must also be included. - * - * this software is provided as is, without representation from the - * university of michigan as to its fitness for any purpose, and without - * warranty by the university of michigan of any kind, either express - * or implied, including without limitation the implied warranties of - * merchantability and fitness for a particular purpose. the regents - * of the university of michigan shall not be liable for any damages, - * including special, indirect, incidental, or consequential damages, - * with respect to any claim arising out or in connection with the use - * of the software, even if it has been or is hereafter advised of the - * possibility of such damages. - */ - -int ifs_Init(char **reason); -DWORD WINAPI ifs_MainLoop(LPVOID); - - -long ReadData(cm_scache_t *scp, osi_hyper_t offset, long count, char *op, - cm_user_t *userp, long *readp); -long WriteData(cm_scache_t *scp, osi_hyper_t offset, long count, char *op, - cm_user_t *userp, long *readp); diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index cc7c0ab73..871deeffc 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -23,7 +23,6 @@ #include #include -#include <../afsrdr/kif.h> /*extern void afsi_log(char *pattern, ...);*/ diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index 8dafaf342..6ada61bd2 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -35,7 +35,6 @@ #include "cm_rpc.h" #include #include -#include <..\afsrdr\kif.h> #include #ifdef _DEBUG diff --git a/src/sys/pioctl_nt.c b/src/sys/pioctl_nt.c index d3959c57a..dd323d81a 100644 --- a/src/sys/pioctl_nt.c +++ b/src/sys/pioctl_nt.c @@ -43,7 +43,6 @@ RCSID #include #include #include -#include <../WINNT/afsrdr/kif.h> #include #include -- 2.39.5