ms-nfs41-client/daemon/daemon_debug.c

679 lines
28 KiB
C
Raw Permalink Normal View History

/* NFSv4.1 client for Windows
* Copyright <EFBFBD> 2012 The Regents of the University of Michigan
*
* Olga Kornievskaia <aglo@umich.edu>
* Casey Bodley <cbodley@umich.edu>
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* without any warranty; without even the implied warranty of merchantability
* or fitness for a particular purpose. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA
*/
#include <windows.h>
#include <stdio.h>
#include "daemon_debug.h"
#include "from_kernel.h"
#include "nfs41_driver.h"
#include "nfs41_ops.h"
2010-10-12 09:58:23 -04:00
#include "service.h"
#include "rpc/rpc.h"
#include "rpc/auth_sspi.h"
static int g_debug_level = DEFAULT_DEBUG_LEVEL;
void set_debug_level(int level) { g_debug_level = level; }
2010-10-12 09:58:23 -04:00
FILE *dlog_file, *elog_file;
#ifndef STANDALONE_NFSD
void open_log_files()
{
const char dfile[] = "nfsddbg.log";
const char efile[] = "nfsderr.log";
const char mode[] = "w";
if (g_debug_level > 0) {
dlog_file = fopen(dfile, mode);
if (dlog_file == NULL) {
ReportStatusToSCMgr(SERVICE_STOPPED, GetLastError(), 0);
exit (GetLastError());
}
}
elog_file = fopen(efile, mode);
if (elog_file == NULL) {
ReportStatusToSCMgr(SERVICE_STOPPED, GetLastError(), 0);
exit (GetLastError());
}
}
void close_log_files()
{
if (dlog_file) fclose(dlog_file);
if (elog_file) fclose(elog_file);
}
#else
void open_log_files()
{
dlog_file = stdout;
elog_file = stderr;
}
#endif
void dprintf(int level, LPCSTR format, ...)
{
if (level <= g_debug_level) {
va_list args;
va_start(args, format);
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "%04x: ", GetCurrentThreadId());
vfprintf(dlog_file, format, args);
#ifndef STANDALONE_NFSD
fflush(dlog_file);
#endif
va_end(args);
}
}
void eprintf(LPCSTR format, ...)
{
va_list args;
va_start(args, format);
2010-10-12 09:58:23 -04:00
fprintf(elog_file, "%04x: ", GetCurrentThreadId());
vfprintf(elog_file, format, args);
#ifndef STANDALONE_NFSD
fflush(elog_file);
#endif
va_end(args);
}
void print_hexbuf(int level, unsigned char *title, unsigned char *buf, int len)
{
int j, k;
if (level > g_debug_level) return;
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "%s", title);
for(j = 0, k = 0; j < len; j++, k++) {
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "%02x '%c' ", buf[j], isascii(buf[j])? buf[j]:' ');
if (((k+1) % 10 == 0 && k > 0)) {
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "\n");
}
}
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "\n");
}
void print_hexbuf_no_asci(int level, unsigned char *title, unsigned char *buf, int len)
{
int j, k;
if (level > g_debug_level) return;
fprintf(dlog_file, "%s", title);
for(j = 0, k = 0; j < len; j++, k++) {
fprintf(dlog_file, "%02x ", buf[j]);
if (((k+1) % 10 == 0 && k > 0)) {
fprintf(dlog_file, "\n");
}
}
fprintf(dlog_file, "\n");
}
void print_create_attributes(int level, DWORD create_opts) {
if (level > g_debug_level) return;
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "create attributes: ");
if (create_opts & FILE_DIRECTORY_FILE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "DIRECTORY_FILE ");
if (create_opts & FILE_NON_DIRECTORY_FILE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "NON_DIRECTORY_FILE ");
if (create_opts & FILE_WRITE_THROUGH)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "WRITE_THROUGH ");
if (create_opts & FILE_SEQUENTIAL_ONLY)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQUENTIAL_ONLY ");
if (create_opts & FILE_RANDOM_ACCESS)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "RANDOM_ACCESS ");
if (create_opts & FILE_NO_INTERMEDIATE_BUFFERING)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "NO_INTERMEDIATE_BUFFERING ");
if (create_opts & FILE_SYNCHRONOUS_IO_ALERT)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SYNCHRONOUS_IO_ALERT ");
if (create_opts & FILE_SYNCHRONOUS_IO_NONALERT)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SYNCHRONOUS_IO_NONALERT ");
if (create_opts & FILE_CREATE_TREE_CONNECTION)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "CREATE_TREE_CONNECTION ");
if (create_opts & FILE_COMPLETE_IF_OPLOCKED)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "COMPLETE_IF_OPLOCKED ");
if (create_opts & FILE_NO_EA_KNOWLEDGE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "NO_EA_KNOWLEDGE ");
if (create_opts & FILE_OPEN_REPARSE_POINT)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "OPEN_REPARSE_POINT ");
if (create_opts & FILE_DELETE_ON_CLOSE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "DELETE_ON_CLOSE ");
if (create_opts & FILE_OPEN_BY_FILE_ID)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "OPEN_BY_FILE_ID ");
if (create_opts & FILE_OPEN_FOR_BACKUP_INTENT)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "OPEN_FOR_BACKUP_INTENT ");
if (create_opts & FILE_RESERVE_OPFILTER)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "RESERVE_OPFILTER");
fprintf(dlog_file, "\n");
}
void print_disposition(int level, DWORD disposition) {
if (level > g_debug_level) return;
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "userland disposition = ");
if (disposition == FILE_SUPERSEDE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "FILE_SUPERSEDE\n");
else if (disposition == FILE_CREATE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "FILE_CREATE\n");
else if (disposition == FILE_OPEN)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "FILE_OPEN\n");
else if (disposition == FILE_OPEN_IF)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "FILE_OPEN_IF\n");
else if (disposition == FILE_OVERWRITE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "FILE_OVERWRITE\n");
else if (disposition == FILE_OVERWRITE_IF)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "FILE_OVERWRITE_IF\n");
}
void print_access_mask(int level, DWORD access_mask) {
if (level > g_debug_level) return;
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "access mask: ");
if (access_mask & FILE_READ_DATA)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "READ ");
if (access_mask & STANDARD_RIGHTS_READ)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "READ_ACL ");
if (access_mask & FILE_READ_ATTRIBUTES)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "READ_ATTR ");
if (access_mask & FILE_READ_EA)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "READ_EA ");
if (access_mask & FILE_WRITE_DATA)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "WRITE ");
if (access_mask & STANDARD_RIGHTS_WRITE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "WRITE_ACL ");
if (access_mask & FILE_WRITE_ATTRIBUTES)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "WRITE_ATTR ");
if (access_mask & FILE_WRITE_EA)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "WRITE_EA ");
if (access_mask & FILE_APPEND_DATA)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "APPEND ");
if (access_mask & FILE_EXECUTE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "EXECUTE ");
if (access_mask & FILE_LIST_DIRECTORY)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "LIST ");
if (access_mask & FILE_TRAVERSE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "TRAVERSE ");
if (access_mask & SYNCHRONIZE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SYNC ");
if (access_mask & FILE_DELETE_CHILD)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "DELETE_CHILD");
fprintf(dlog_file, "\n");
}
void print_share_mode(int level, DWORD mode)
{
if (level > g_debug_level) return;
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "share mode: ");
if (mode & FILE_SHARE_READ)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "READ ");
if (mode & FILE_SHARE_WRITE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "WRITE ");
if (mode & FILE_SHARE_DELETE)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "DELETE");
fprintf(dlog_file, "\n");
}
void print_file_id_both_dir_info(int level, FILE_ID_BOTH_DIR_INFO *pboth_dir_info)
{
if (level > g_debug_level) return;
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "FILE_ID_BOTH_DIR_INFO %p %d\n",
pboth_dir_info, sizeof(unsigned char *));
fprintf(dlog_file, "\tNextEntryOffset=%ld %d %d\n",
pboth_dir_info->NextEntryOffset,
sizeof(pboth_dir_info->NextEntryOffset), sizeof(DWORD));
fprintf(dlog_file, "\tFileIndex=%ld %d\n", pboth_dir_info->FileIndex,
sizeof(pboth_dir_info->FileIndex));
fprintf(dlog_file, "\tCreationTime=0x%x %d\n",
pboth_dir_info->CreationTime.QuadPart,
sizeof(pboth_dir_info->CreationTime));
fprintf(dlog_file, "\tLastAccessTime=0x%x %d\n",
pboth_dir_info->LastAccessTime.QuadPart,
sizeof(pboth_dir_info->LastAccessTime));
fprintf(dlog_file, "\tLastWriteTime=0x%x %d\n",
pboth_dir_info->LastWriteTime.QuadPart,
sizeof(pboth_dir_info->LastWriteTime));
fprintf(dlog_file, "\tChangeTime=0x%x %d\n",
pboth_dir_info->ChangeTime.QuadPart,
sizeof(pboth_dir_info->ChangeTime));
fprintf(dlog_file, "\tEndOfFile=0x%x %d\n",
pboth_dir_info->EndOfFile.QuadPart,
sizeof(pboth_dir_info->EndOfFile));
fprintf(dlog_file, "\tAllocationSize=0x%x %d\n",
pboth_dir_info->AllocationSize.QuadPart,
sizeof(pboth_dir_info->AllocationSize));
fprintf(dlog_file, "\tFileAttributes=%ld %d\n",
pboth_dir_info->FileAttributes,
sizeof(pboth_dir_info->FileAttributes));
fprintf(dlog_file, "\tFileNameLength=%ld %d\n",
pboth_dir_info->FileNameLength,
sizeof(pboth_dir_info->FileNameLength));
fprintf(dlog_file, "\tEaSize=%ld %d\n",
pboth_dir_info->EaSize, sizeof(pboth_dir_info->EaSize));
fprintf(dlog_file, "\tShortNameLength=%d %d\n",
pboth_dir_info->ShortNameLength,
sizeof(pboth_dir_info->ShortNameLength));
fprintf(dlog_file, "\tShortName='%S' %d\n", pboth_dir_info->ShortName,
sizeof(pboth_dir_info->ShortName));
fprintf(dlog_file, "\tFileId=0x%x %d\n", pboth_dir_info->FileId.QuadPart,
sizeof(pboth_dir_info->FileId));
fprintf(dlog_file, "\tFileName='%S' %p\n", pboth_dir_info->FileName,
pboth_dir_info->FileName);
}
void print_opcode(int level, DWORD opcode)
{
dprintf(level, (LPCSTR)opcode2string(opcode));
}
const char* opcode2string(DWORD opcode)
{
switch(opcode) {
case NFS41_SHUTDOWN: return "NFS41_SHUTDOWN";
case NFS41_MOUNT: return "NFS41_MOUNT";
case NFS41_UNMOUNT: return "NFS41_UNMOUNT";
case NFS41_OPEN: return "NFS41_OPEN";
case NFS41_CLOSE: return "NFS41_CLOSE";
case NFS41_READ: return "NFS41_READ";
case NFS41_WRITE: return "NFS41_WRITE";
case NFS41_LOCK: return "NFS41_LOCK";
case NFS41_UNLOCK: return "NFS41_UNLOCK";
case NFS41_DIR_QUERY: return "NFS41_DIR_QUERY";
case NFS41_FILE_QUERY: return "NFS41_FILE_QUERY";
case NFS41_FILE_SET: return "NFS41_FILE_SET";
case NFS41_EA_SET: return "NFS41_EA_SET";
2011-09-22 14:56:11 -04:00
case NFS41_EA_GET: return "NFS41_EA_GET";
case NFS41_SYMLINK: return "NFS41_SYMLINK";
case NFS41_VOLUME_QUERY: return "NFS41_VOLUME_QUERY";
first stab at handling security irp Basic handling of owner and group security query (no dacl). Added new upcall for NFS41_ACL_QUERY (driver and daemon code). Daemon, upon getting NFS41_ACL_QUERY first places a getattr that has owner, group attribute request. We currently don't cache them!!! Then, we parse nfs4name format (ie user@domain or group@domain) into user and domain. We currently ignore domain part!!! Then, we assume that whatever we are mapping is "known" locally (ie LookupAccountName() api which retrieves a SID for a given name). Mapping from name to SID can only be done in the userland. We then copy the bytes via the upcall pipe to the kernel. If the received user or group cant be mapped via LookupAccoundName(), we create a well known null SID as the reply. Kernel creates a security descriptor in the absolute-format and adds owner and group sids to it. Important: RtlSetOwner/Group functions only work with absolute-format security descriptor, however the reply to the user needs to be in the self-relative format. The way security query works is that it passes us a buffer to be filled with the security context. However the user doesn't know how big the buffer should be so, the user is allowed to pass a null buffer and have the kernel return how much memory is needed. This leads to 2 security queries => 2 NFS41_ACL_QUERY upcalls => 2 getattr rpcs... It should be improved. TODO: - need to add caching of owner/group attributes for a file? - need to add calls to LDAP for more general mapping? - need to cache reply of the ACL if supplied length is 0?
2011-03-15 16:31:52 -04:00
case NFS41_ACL_QUERY: return "NFS41_ACL_QUERY";
case NFS41_ACL_SET: return "NFS41_ACL_SET";
default: return "UNKNOWN";
}
}
const char* nfs_opnum_to_string(int opnum)
{
switch (opnum)
{
case OP_ACCESS: return "ACCESS";
case OP_CLOSE: return "CLOSE";
case OP_COMMIT: return "COMMIT";
case OP_CREATE: return "CREATE";
case OP_DELEGPURGE: return "DELEGPURGE";
case OP_DELEGRETURN: return "DELEGRETURN";
case OP_GETATTR: return "GETATTR";
case OP_GETFH: return "GETFH";
case OP_LINK: return "LINK";
case OP_LOCK: return "LOCK";
case OP_LOCKT: return "LOCKT";
case OP_LOCKU: return "LOCKU";
case OP_LOOKUP: return "LOOKUP";
case OP_LOOKUPP: return "LOOKUPP";
case OP_NVERIFY: return "NVERIFY";
case OP_OPEN: return "OPEN";
case OP_OPENATTR: return "OPENATTR";
case OP_OPEN_CONFIRM: return "OPEN_CONFIRM";
case OP_OPEN_DOWNGRADE: return "OPEN_DOWNGRADE";
case OP_PUTFH: return "PUTFH";
case OP_PUTPUBFH: return "PUTPUBFH";
case OP_PUTROOTFH: return "PUTROOTFH";
case OP_READ: return "READ";
case OP_READDIR: return "READDIR";
case OP_READLINK: return "READLINK";
case OP_REMOVE: return "REMOVE";
case OP_RENAME: return "RENAME";
case OP_RENEW: return "RENEW";
case OP_RESTOREFH: return "RESTOREFH";
case OP_SAVEFH: return "SAVEFH";
case OP_SECINFO: return "SECINFO";
case OP_SETATTR: return "SETATTR";
case OP_SETCLIENTID: return "SETCLIENTID";
case OP_SETCLIENTID_CONFIRM: return "SETCLIENTID_CONFIRM";
case OP_VERIFY: return "VERIFY";
case OP_WRITE: return "WRITE";
case OP_RELEASE_LOCKOWNER: return "RELEASE_LOCKOWNER";
case OP_BACKCHANNEL_CTL: return "BACKCHANNEL_CTL";
case OP_BIND_CONN_TO_SESSION: return "BIND_CONN_TO_SESSION";
case OP_EXCHANGE_ID: return "EXCHANGE_ID";
case OP_CREATE_SESSION: return "CREATE_SESSION";
case OP_DESTROY_SESSION: return "DESTROY_SESSION";
case OP_FREE_STATEID: return "FREE_STATEID";
case OP_GET_DIR_DELEGATION: return "GET_DIR_DELEGATION";
case OP_GETDEVICEINFO: return "GETDEVICEINFO";
case OP_GETDEVICELIST: return "GETDEVICELIST";
case OP_LAYOUTCOMMIT: return "LAYOUTCOMMIT";
case OP_LAYOUTGET: return "LAYOUTGET";
case OP_LAYOUTRETURN: return "LAYOUTRETURN";
case OP_SECINFO_NO_NAME: return "SECINFO_NO_NAME";
case OP_SEQUENCE: return "SEQUENCE";
case OP_SET_SSV: return "SET_SSV";
case OP_TEST_STATEID: return "TEST_STATEID";
case OP_WANT_DELEGATION: return "WANT_DELEGATION";
case OP_DESTROY_CLIENTID: return "DESTROY_CLIENTID";
case OP_RECLAIM_COMPLETE: return "RECLAIM_COMPLETE";
case OP_ILLEGAL: return "ILLEGAL";
default: return "invalid nfs opnum";
}
}
const char* nfs_error_string(int status)
{
switch (status)
{
case NFS4_OK: return "NFS4_OK";
case NFS4ERR_PERM: return "NFS4ERR_PERM";
case NFS4ERR_NOENT: return "NFS4ERR_NOENT";
case NFS4ERR_IO: return "NFS4ERR_IO";
case NFS4ERR_NXIO: return "NFS4ERR_NXIO";
case NFS4ERR_ACCESS: return "NFS4ERR_ACCESS";
case NFS4ERR_EXIST: return "NFS4ERR_EXIST";
case NFS4ERR_XDEV: return "NFS4ERR_XDEV";
case NFS4ERR_NOTDIR: return "NFS4ERR_NOTDIR";
case NFS4ERR_ISDIR: return "NFS4ERR_ISDIR";
case NFS4ERR_INVAL: return "NFS4ERR_INVAL";
case NFS4ERR_FBIG: return "NFS4ERR_FBIG";
case NFS4ERR_NOSPC: return "NFS4ERR_NOSPC";
case NFS4ERR_ROFS: return "NFS4ERR_ROFS";
case NFS4ERR_MLINK: return "NFS4ERR_MLINK";
case NFS4ERR_NAMETOOLONG: return "NFS4ERR_NAMETOOLONG";
case NFS4ERR_NOTEMPTY: return "NFS4ERR_NOTEMPTY";
case NFS4ERR_DQUOT: return "NFS4ERR_DQUOT";
case NFS4ERR_STALE: return "NFS4ERR_STALE";
case NFS4ERR_BADHANDLE: return "NFS4ERR_BADHANDLE";
case NFS4ERR_BAD_COOKIE: return "NFS4ERR_BAD_COOKIE";
case NFS4ERR_NOTSUPP: return "NFS4ERR_NOTSUPP";
case NFS4ERR_TOOSMALL: return "NFS4ERR_TOOSMALL";
case NFS4ERR_SERVERFAULT: return "NFS4ERR_SERVERFAULT";
case NFS4ERR_BADTYPE: return "NFS4ERR_BADTYPE";
case NFS4ERR_DELAY: return "NFS4ERR_DELAY";
case NFS4ERR_SAME: return "NFS4ERR_SAME";
case NFS4ERR_DENIED: return "NFS4ERR_DENIED";
case NFS4ERR_EXPIRED: return "NFS4ERR_EXPIRED";
case NFS4ERR_LOCKED: return "NFS4ERR_LOCKED";
case NFS4ERR_GRACE: return "NFS4ERR_GRACE";
case NFS4ERR_FHEXPIRED: return "NFS4ERR_FHEXPIRED";
case NFS4ERR_SHARE_DENIED: return "NFS4ERR_SHARE_DENIED";
case NFS4ERR_WRONGSEC: return "NFS4ERR_WRONGSEC";
case NFS4ERR_CLID_INUSE: return "NFS4ERR_CLID_INUSE";
case NFS4ERR_RESOURCE: return "NFS4ERR_RESOURCE";
case NFS4ERR_MOVED: return "NFS4ERR_MOVED";
case NFS4ERR_NOFILEHANDLE: return "NFS4ERR_NOFILEHANDLE";
case NFS4ERR_MINOR_VERS_MISMATCH: return "NFS4ERR_MINOR_VERS_MISMATCH";
case NFS4ERR_STALE_CLIENTID: return "NFS4ERR_STALE_CLIENTID";
case NFS4ERR_STALE_STATEID: return "NFS4ERR_STALE_STATEID";
case NFS4ERR_OLD_STATEID: return "NFS4ERR_OLD_STATEID";
case NFS4ERR_BAD_STATEID: return "NFS4ERR_BAD_STATEID";
case NFS4ERR_BAD_SEQID: return "NFS4ERR_BAD_SEQID";
case NFS4ERR_NOT_SAME: return "NFS4ERR_NOT_SAME";
case NFS4ERR_LOCK_RANGE: return "NFS4ERR_LOCK_RANGE";
case NFS4ERR_SYMLINK: return "NFS4ERR_SYMLINK";
case NFS4ERR_RESTOREFH: return "NFS4ERR_RESTOREFH";
case NFS4ERR_LEASE_MOVED: return "NFS4ERR_LEASE_MOVED";
case NFS4ERR_ATTRNOTSUPP: return "NFS4ERR_ATTRNOTSUPP";
case NFS4ERR_NO_GRACE: return "NFS4ERR_NO_GRACE";
case NFS4ERR_RECLAIM_BAD: return "NFS4ERR_RECLAIM_BAD";
case NFS4ERR_RECLAIM_CONFLICT: return "NFS4ERR_RECLAIM_CONFLICT";
case NFS4ERR_BADXDR: return "NFS4ERR_BADXDR";
case NFS4ERR_LOCKS_HELD: return "NFS4ERR_LOCKS_HELD";
case NFS4ERR_OPENMODE: return "NFS4ERR_OPENMODE";
case NFS4ERR_BADOWNER: return "NFS4ERR_BADOWNER";
case NFS4ERR_BADCHAR: return "NFS4ERR_BADCHAR";
case NFS4ERR_BADNAME: return "NFS4ERR_BADNAME";
case NFS4ERR_BAD_RANGE: return "NFS4ERR_BAD_RANGE";
case NFS4ERR_LOCK_NOTSUPP: return "NFS4ERR_LOCK_NOTSUPP";
case NFS4ERR_OP_ILLEGAL: return "NFS4ERR_OP_ILLEGAL";
case NFS4ERR_DEADLOCK: return "NFS4ERR_DEADLOCK";
case NFS4ERR_FILE_OPEN: return "NFS4ERR_FILE_OPEN";
case NFS4ERR_ADMIN_REVOKED: return "NFS4ERR_ADMIN_REVOKED";
case NFS4ERR_CB_PATH_DOWN: return "NFS4ERR_CB_PATH_DOWN";
case NFS4ERR_BADIOMODE: return "NFS4ERR_BADIOMODE";
case NFS4ERR_BADLAYOUT: return "NFS4ERR_BADLAYOUT";
case NFS4ERR_BAD_SESSION_DIGEST: return "NFS4ERR_BAD_SESSION_DIGEST";
case NFS4ERR_BADSESSION: return "NFS4ERR_BADSESSION";
case NFS4ERR_BADSLOT: return "NFS4ERR_BADSLOT";
case NFS4ERR_COMPLETE_ALREADY: return "NFS4ERR_COMPLETE_ALREADY";
case NFS4ERR_CONN_NOT_BOUND_TO_SESSION: return "NFS4ERR_CONN_NOT_BOUND_TO_SESSION";
case NFS4ERR_DELEG_ALREADY_WANTED: return "NFS4ERR_DELEG_ALREADY_WANTED";
case NFS4ERR_BACK_CHAN_BUSY: return "NFS4ERR_BACK_CHAN_BUSY";
case NFS4ERR_LAYOUTTRYLATER: return "NFS4ERR_LAYOUTTRYLATER";
case NFS4ERR_LAYOUTUNAVAILABLE: return "NFS4ERR_LAYOUTUNAVAILABLE";
case NFS4ERR_NOMATCHING_LAYOUT: return "NFS4ERR_NOMATCHING_LAYOUT";
case NFS4ERR_RECALLCONFLICT: return "NFS4ERR_RECALLCONFLICT";
case NFS4ERR_UNKNOWN_LAYOUTTYPE: return "NFS4ERR_UNKNOWN_LAYOUTTYPE";
case NFS4ERR_SEQ_MISORDERED: return "NFS4ERR_SEQ_MISORDERED";
case NFS4ERR_SEQUENCE_POS: return "NFS4ERR_SEQUENCE_POS";
case NFS4ERR_REQ_TOO_BIG: return "NFS4ERR_REQ_TOO_BIG";
case NFS4ERR_REP_TOO_BIG: return "NFS4ERR_REP_TOO_BIG";
case NFS4ERR_REP_TOO_BIG_TO_CACHE: return "NFS4ERR_REP_TOO_BIG_TO_CACHE";
case NFS4ERR_RETRY_UNCACHED_REP: return "NFS4ERR_RETRY_UNCACHED_REP";
case NFS4ERR_UNSAFE_COMPOUND: return "NFS4ERR_UNSAFE_COMPOUND";
case NFS4ERR_TOO_MANY_OPS: return "NFS4ERR_TOO_MANY_OPS";
case NFS4ERR_OP_NOT_IN_SESSION: return "NFS4ERR_OP_NOT_IN_SESSION";
case NFS4ERR_HASH_ALG_UNSUPP: return "NFS4ERR_HASH_ALG_UNSUPP";
case NFS4ERR_CLIENTID_BUSY: return "NFS4ERR_CLIENTID_BUSY";
case NFS4ERR_PNFS_IO_HOLE: return "NFS4ERR_PNFS_IO_HOLE";
case NFS4ERR_SEQ_FALSE_RETRY: return "NFS4ERR_SEQ_FALSE_RETRY";
case NFS4ERR_BAD_HIGH_SLOT: return "NFS4ERR_BAD_HIGH_SLOT";
case NFS4ERR_DEADSESSION: return "NFS4ERR_DEADSESSION";
case NFS4ERR_ENCR_ALG_UNSUPP: return "NFS4ERR_ENCR_ALG_UNSUPP";
case NFS4ERR_PNFS_NO_LAYOUT: return "NFS4ERR_PNFS_NO_LAYOUT";
case NFS4ERR_NOT_ONLY_OP: return "NFS4ERR_NOT_ONLY_OP";
case NFS4ERR_WRONG_CRED: return "NFS4ERR_WRONG_CRED";
case NFS4ERR_WRONG_TYPE: return "NFS4ERR_WRONG_TYPE";
case NFS4ERR_DIRDELEG_UNAVAIL: return "NFS4ERR_DIRDELEG_UNAVAIL";
case NFS4ERR_REJECT_DELEG: return "NFS4ERR_REJECT_DELEG";
case NFS4ERR_RETURNCONFLICT: return "NFS4ERR_RETURNCONFLICT";
case NFS4ERR_DELEG_REVOKED: return "NFS4ERR_DELEG_REVOKED";
default: return "invalid nfs error code";
}
}
const char* rpc_error_string(int status)
{
switch (status)
{
case RPC_CANTENCODEARGS: return "RPC_CANTENCODEARGS";
case RPC_CANTDECODERES: return "RPC_CANTDECODERES";
case RPC_CANTSEND: return "RPC_CANTSEND";
case RPC_CANTRECV: return "RPC_CANTRECV";
case RPC_TIMEDOUT: return "RPC_TIMEDOUT";
case RPC_INTR: return "RPC_INTR";
case RPC_UDERROR: return "RPC_UDERROR";
case RPC_VERSMISMATCH: return "RPC_VERSMISMATCH";
case RPC_AUTHERROR: return "RPC_AUTHERROR";
case RPC_PROGUNAVAIL: return "RPC_PROGUNAVAIL";
case RPC_PROGVERSMISMATCH: return "RPC_PROGVERSMISMATCH";
case RPC_PROCUNAVAIL: return "RPC_PROCUNAVAIL";
case RPC_CANTDECODEARGS: return "RPC_CANTDECODEARGS";
case RPC_SYSTEMERROR: return "RPC_SYSTEMERROR";
default: return "invalid rpc error code";
}
}
const char* gssauth_string(int type) {
switch(type) {
case RPCSEC_SSPI_SVC_NONE: return "RPCSEC_SSPI_SVC_NONE";
case RPCSEC_SSPI_SVC_INTEGRITY: return "RPCSEC_SSPI_SVC_INTEGRITY";
case RPCSEC_SSPI_SVC_PRIVACY: return "RPCSEC_SSPI_SVC_PRIVACY";
default: return "invalid gss auth type";
}
}
void print_condwait_status(int level, int status)
{
if (level > g_debug_level) return;
switch(status) {
2010-10-12 09:58:23 -04:00
case WAIT_ABANDONED: fprintf(dlog_file, "WAIT_ABANDONED\n"); break;
case WAIT_OBJECT_0: fprintf(dlog_file, "WAIT_OBJECT_0\n"); break;
case WAIT_TIMEOUT: fprintf(dlog_file, "WAIT_TIMEOUT\n"); break;
case WAIT_FAILED: fprintf(dlog_file, "WAIT_FAILED %d\n", GetLastError());
default: fprintf(dlog_file, "unknown status =%d\n", status);
}
}
void print_sr_status_flags(int level, int flags)
{
if (level > g_debug_level) return;
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "%04x: sr_status_flags: ", GetCurrentThreadId());
if (flags & SEQ4_STATUS_CB_PATH_DOWN)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_CB_PATH_DOWN ");
if (flags & SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRING)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRING ");
if (flags & SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRED)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRED ");
if (flags & SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED ");
if (flags & SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED ");
if (flags & SEQ4_STATUS_ADMIN_STATE_REVOKED)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_ADMIN_STATE_REVOKED ");
if (flags & SEQ4_STATUS_RECALLABLE_STATE_REVOKED)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_RECALLABLE_STATE_REVOKED ");
if (flags & SEQ4_STATUS_LEASE_MOVED)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_LEASE_MOVED ");
if (flags & SEQ4_STATUS_RESTART_RECLAIM_NEEDED)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_RESTART_RECLAIM_NEEDED ");
if (flags & SEQ4_STATUS_CB_PATH_DOWN_SESSION)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_CB_PATH_DOWN_SESSION ");
if (flags & SEQ4_STATUS_BACKCHANNEL_FAULT)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_BACKCHANNEL_FAULT ");
if (flags & SEQ4_STATUS_DEVID_CHANGED)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_DEVID_CHANGED ");
if (flags & SEQ4_STATUS_DEVID_DELETED)
2010-10-12 09:58:23 -04:00
fprintf(dlog_file, "SEQ4_STATUS_DEVID_DELETED ");
fprintf(dlog_file, "\n");
}
2010-12-01 19:11:47 -05:00
const char* secflavorop2name(DWORD sec_flavor)
{
switch(sec_flavor) {
case RPCSEC_AUTH_SYS: return "AUTH_SYS";
case RPCSEC_AUTHGSS_KRB5: return "AUTHGSS_KRB5";
case RPCSEC_AUTHGSS_KRB5I: return "AUTHGSS_KRB5I";
case RPCSEC_AUTHGSS_KRB5P: return "AUTHGSS_KRB5P";
}
return "UNKNOWN FLAVOR";
}
void print_windows_access_mask(int on, ACCESS_MASK m)
{
if (!on) return;
dprintf(1, "--> print_windows_access_mask: %x\n", m);
if (m & GENERIC_READ)
dprintf(1, "\tGENERIC_READ\n");
if (m & GENERIC_WRITE)
dprintf(1, "\tGENERIC_WRITE\n");
if (m & GENERIC_EXECUTE)
dprintf(1, "\tGENERIC_EXECUTE\n");
if (m & GENERIC_ALL)
dprintf(1, "\tGENERIC_ALL\n");
if (m & MAXIMUM_ALLOWED)
dprintf(1, "\tMAXIMUM_ALLOWED\n");
if (m & ACCESS_SYSTEM_SECURITY)
dprintf(1, "\tACCESS_SYSTEM_SECURITY\n");
if ((m & SPECIFIC_RIGHTS_ALL) == SPECIFIC_RIGHTS_ALL)
dprintf(1, "\tSPECIFIC_RIGHTS_ALL\n");
if ((m & STANDARD_RIGHTS_ALL) == STANDARD_RIGHTS_ALL)
dprintf(1, "\tSTANDARD_RIGHTS_ALL\n");
if ((m & STANDARD_RIGHTS_REQUIRED) == STANDARD_RIGHTS_REQUIRED)
dprintf(1, "\tSTANDARD_RIGHTS_REQUIRED\n");
if (m & SYNCHRONIZE)
dprintf(1, "\tSYNCHRONIZE\n");
if (m & WRITE_OWNER)
dprintf(1, "\tWRITE_OWNER\n");
if (m & WRITE_DAC)
dprintf(1, "\tWRITE_DAC\n");
if (m & READ_CONTROL)
dprintf(1, "\tREAD_CONTROL\n");
if (m & DELETE)
dprintf(1, "\tDELETE\n");
if (m & FILE_READ_DATA)
dprintf(1, "\tFILE_READ_DATA\n");
if (m & FILE_LIST_DIRECTORY)
dprintf(1, "\tFILE_LIST_DIRECTORY\n");
if (m & FILE_WRITE_DATA)
dprintf(1, "\tFILE_WRITE_DATA\n");
if (m & FILE_ADD_FILE)
dprintf(1, "\tFILE_ADD_FILE\n");
if (m & FILE_APPEND_DATA)
dprintf(1, "\tFILE_APPEND_DATA\n");
if (m & FILE_ADD_SUBDIRECTORY)
dprintf(1, "\tFILE_ADD_SUBDIRECTORY\n");
if (m & FILE_CREATE_PIPE_INSTANCE)
dprintf(1, "\tFILE_CREATE_PIPE_INSTANCE\n");
if (m & FILE_READ_EA)
dprintf(1, "\tFILE_READ_EA\n");
if (m & FILE_WRITE_EA)
dprintf(1, "\tFILE_WRITE_EA\n");
if (m & FILE_EXECUTE)
dprintf(1, "\tFILE_EXECUTE\n");
if (m & FILE_TRAVERSE)
dprintf(1, "\tFILE_TRAVERSE\n");
if (m & FILE_DELETE_CHILD)
dprintf(1, "\tFILE_DELETE_CHILD\n");
if (m & FILE_READ_ATTRIBUTES)
dprintf(1, "\tFILE_READ_ATTRIBUTES\n");
if (m & FILE_WRITE_ATTRIBUTES)
dprintf(1, "\tFILE_WRITE_ATTRIBUTES\n");
if ((m & FILE_ALL_ACCESS) == FILE_ALL_ACCESS)
dprintf(1, "\tFILE_ALL_ACCESS\n");
if ((m & FILE_GENERIC_READ) == FILE_GENERIC_READ)
dprintf(1, "\tFILE_GENERIC_READ\n");
if ((m & FILE_GENERIC_WRITE) == FILE_GENERIC_WRITE)
dprintf(1, "\tFILE_GENERIC_WRITE\n");
if ((m & FILE_GENERIC_EXECUTE) == FILE_GENERIC_EXECUTE)
dprintf(1, "\tFILE_GENERIC_EXECUTE\n");
}
void print_nfs_access_mask(int on, int m)
{
if (!on) return;
dprintf(1, "--> print_nfs_access_mask: %x\n", m);
if (m & ACE4_READ_DATA)
dprintf(1, "\tACE4_READ_DATA\n");
if (m & ACE4_LIST_DIRECTORY)
dprintf(1, "\tACE4_LIST_DIRECTORY\n");
if (m & ACE4_WRITE_DATA)
dprintf(1, "\tACE4_WRITE_DATA\n");
if (m & ACE4_ADD_FILE)
dprintf(1, "\tACE4_ADD_FILE\n");
if (m & ACE4_APPEND_DATA)
dprintf(1, "\tACE4_APPEND_DATA\n");
if (m & ACE4_ADD_SUBDIRECTORY)
dprintf(1, "\tACE4_ADD_SUBDIRECTORY\n");
if (m & ACE4_READ_NAMED_ATTRS)
dprintf(1, "\tACE4_READ_NAMED_ATTRS\n");
if (m & ACE4_WRITE_NAMED_ATTRS)
dprintf(1, "\tACE4_WRITE_NAMED_ATTRS\n");
if (m & ACE4_EXECUTE)
dprintf(1, "\tACE4_EXECUTE\n");
if (m & ACE4_DELETE_CHILD)
dprintf(1, "\tACE4_DELETE_CHILD\n");
if (m & ACE4_READ_ATTRIBUTES)
dprintf(1, "\tACE4_READ_ATTRIBUTES\n");
if (m & ACE4_WRITE_ATTRIBUTES)
dprintf(1, "\tACE4_WRITE_ATTRIBUTES\n");
if (m & ACE4_DELETE)
dprintf(1, "\tACE4_DELETE\n");
if (m & ACE4_READ_ACL)
dprintf(1, "\tACE4_READ_ACL\n");
if (m & ACE4_WRITE_ACL)
dprintf(1, "\tACE4_WRITE_ACL\n");
if (m & ACE4_WRITE_OWNER)
dprintf(1, "\tACE4_WRITE_OWNER\n");
if (m & ACE4_SYNCHRONIZE)
dprintf(1, "\tACE4_SYNCHRONIZE\n");
}