#define AFS_64BIT_IOPS_ENV 1
#define AFS_NAMEI_ENV 1 /* User space interface to file system */
#define AFS_HAVE_STATVFS 0 /* System doesn't support statvfs */
+#define AFS_KRB5_ERROR_ENV 1 /* fetch_krb5_error_message() available in afsutil.lib */
#include <afs/afs_sysnames.h>
#define SYS_NAME_ID SYS_NAME_ID_amd64_w2k
#define AFS_64BIT_IOPS_ENV 1
#define AFS_NAMEI_ENV 1 /* User space interface to file system */
#define AFS_HAVE_STATVFS 0 /* System doesn't support statvfs */
+#define AFS_KRB5_ERROR_ENV 1 /* fetch_krb5_error_message() available in afsutil.lib */
#include <afs/afs_sysnames.h>
#define SYS_NAME_ID SYS_NAME_ID_i386_nt35
#define AFS_64BIT_IOPS_ENV 1
#define AFS_NAMEI_ENV 1 /* User space interface to file system */
#define AFS_HAVE_STATVFS 0 /* System doesn't support statvfs */
+#define AFS_KRB5_ERROR_ENV 1 /* fetch_krb5_error_message() available in afsutil.lib */
#include <afs/afs_sysnames.h>
#define SYS_NAME_ID SYS_NAME_ID_i386_w2k
$(DESTDIR)\lib\afsauthent.lib \
$(DESTDIR)\lib\afs\afsreg.lib
+!IF "$(CPU)" == "IA64" || "$(CPU)" == "AMD64" || "$(CPU)" == "ALPHA64"
+KFWLIBS = \
+ $(AFSROOT)\src\WINNT\kfw\lib\$(CPU)\krb5_64.lib \
+ $(AFSROOT)\src\WINNT\kfw\lib\$(CPU)\comerr64.lib \
+ dnsapi.lib mpr.lib delayimp.lib shell32.lib
+LINKOPTS = /DELAYLOAD:krb5_64.dll /DELAYLOAD:comerr64.dll
+!else
+KFWLIBS = \
+ $(AFSROOT)\src\WINNT\kfw\lib\$(CPU)\krb5_32.lib \
+ $(AFSROOT)\src\WINNT\kfw\lib\$(CPU)\comerr32.lib \
+ dnsapi.lib mpr.lib delayimp.lib shell32.lib
+LINKOPTS = /DELAYLOAD:krb5_32.dll /DELAYLOAD:comerr32.dll
+!endif
+afscflags = -I$(AFSROOT)\src\WINNT\kfw\inc\krb5 $(afscflags)
+
$(DLLFILE): $(DLLOBJS) $(DLLLIBS)
- $(DLLCONLINK) /DEF:afsadminutil.def shell32.lib
+ $(DLLCONLINK) /DEF:afsadminutil.def $(KFWLIBS)
$(_VC_MANIFEST_EMBED_DLL)
$(DLLPREP)
$(CODESIGN_USERLAND)
#include <rx/rx.h>
#include <rx/rxstat.h>
#ifdef AFS_NT40_ENV
-#include <winsock2.h>
+# include <winsock2.h>
+# include <krb5_nt.h>
#else
#include <sys/types.h>
#include <sys/socket.h>
initialize_AU_error_table();
initialize_AV_error_table();
initialize_VOLS_error_table();
+#ifdef AFS_KRB5_ERROR_ENV
+ initialize_krb5();
+#endif
error_init_done = 1;
}
pthread_once(&error_init_once, init_once);
code = (afs_int32) errorCode;
*errorTextP = afs_error_message(code);
+#ifdef AFS_KRB5_ERROR_ENV
+ if (strncmp(*errorTextP, "unknown", strlen("unknown")) == 0) {
+ const char *msg = fetch_krb5_error_message(NULL, code);
+ *errorTextP = msg ? msg : error_message(code);
+ }
+#endif
rc = 1;
fail_util_AdminErrorCodeTranslate:
# General AFS utilities.
+AFSDEV_AUXCDEFINES = $(AFSDEV_AUXCDEFINES) -I..\WINNT\kfw\inc\krb5
RELDIR=util
!INCLUDE ..\config\NTMakefile.$(SYS_NAME)
$(INCFILEDIR)\pthread_nosigs.h \
$(INCFILEDIR)\errmap_nt.h \
$(INCFILEDIR)\dirpath.h \
+ $(INCFILEDIR)\krb5_nt.h \
$(INCFILEDIR)\ktime.h \
$(INCFILEDIR)\fileutil.h \
$(INCFILEDIR)\afsutil_prototypes.h \
$(OUT)\get_krbrlm.obj \
$(OUT)\hostparse.obj \
$(OUT)\isathing.obj \
+ $(OUT)\krb5_nt.obj \
$(OUT)\kreltime.obj \
$(OUT)\ktime.obj \
$(OUT)\netutils.obj \
$(OUT)\get_krbrlm.obj \
$(OUT)\hostparse.obj \
$(OUT)\isathing.obj \
+ $(OUT)\krb5_nt.obj \
$(OUT)\kreltime.obj \
$(OUT)\ktime.obj \
$(OUT)\netutils.obj \
--- /dev/null
+/*
+ * Copyright (c) 2010 Your File System, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Neither the name of Your File System, Inc. nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission from Your File System, Inc.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ #include <afsconfig.h>
+#include <afs/param.h>
+
+#include <windows.h>
+#include "krb5_nt.h"
+
+static char * (KRB5_CALLCONV *pkrb5_get_error_message)(krb5_context context, krb5_error_code code) = NULL;
+static void (KRB5_CALLCONV *pkrb5_free_error_message)(krb5_context context, char *s) = NULL;
+
+# ifndef _WIN64
+# define KRB5LIB "krb5_32.dll"
+# else
+# define KRB5LIB "krb5_64.dll"
+# endif
+
+
+void
+initialize_krb5(void)
+{
+ /*
+ * On Windows, the error table will be initialized when the
+ * krb5 library is loaded into the process. Since not all
+ * versions of krb5 contain krb5_{get,free}_error_message()
+ * we load them conditionally by function pointer.
+ *
+ * On Unix, the MIT krb5 error table will be initialized
+ * by the library on first use.
+ *
+ * initialize_krb5_error_table is a macro substitution to
+ * nothing.
+ */
+ HINSTANCE h = LoadLibrary(KRB5LIB);
+ if (h) {
+ (FARPROC)pkrb5_get_error_message = GetProcAddress(h, "krb5_get_error_message");
+ (FARPROC)pkrb5_free_error_message = GetProcAddress(h, "krb5_free_error_message");
+ }
+}
+
+const char *
+fetch_krb5_error_message(krb5_context context, krb5_error_code code)
+{
+ static char errorText[1024];
+
+ if (pkrb5_get_error_message) {
+ char *msg = pkrb5_get_error_message(context, code);
+ if (msg) {
+ strncpy(errorText, msg, sizeof(errorText));
+ errorText[sizeof(errorText)-1]='\0';
+ pkrb5_free_error_message(context, msg);
+ return errorText;
+ }
+ }
+ return NULL;
+}
--- /dev/null
+/*
+ * Copyright (c) 2010 Your File System, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * - Neither the name of Your File System, Inc. nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission from Your File System, Inc.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifdef AFS_NT40_ENV
+
+# include <krb5\krb5.h>
+# include <com_err.h>
+
+extern void initialize_krb5(void);
+extern const char * fetch_krb5_error_message(krb5_context, krb5_error_code);
+
+#endif /* AFS_NT40_ENV */
\ No newline at end of file