+/* Generic GSS-API support*/
+#ifdef HAVE_GSS_USEROK
+static int ssh_gssapi_generic_userok(
+ ssh_gssapi_client *client, char *user) {
+ if (gss_userok(client->ctx_name, user)) {
+ debug("userok succeded for %s", user);
+ return 1;
+ } else {
+ debug("userok failed for %s", user);
+ return 0;
+ }
+}
+#endif
+
+static int
+ssh_gssapi_generic_localname(ssh_gssapi_client *client,
+ char **localname) {
+ #ifdef HAVE_GSS_LOCALNAME
+ gss_buffer_desc lbuffer;
+ OM_uint32 major, minor;
+ *localname = NULL;
+ major = gss_localname(&minor, client->ctx_name, NULL, &lbuffer);
+ if (GSS_ERROR(major))
+ return 0;
+ if (lbuffer.value == NULL)
+ return 0;
+ *localname = xmalloc(lbuffer.length+1);
+ if (*localname) {
+ memcpy(*localname, lbuffer.value, lbuffer.length);
+ (*localname)[lbuffer.length] = '\0';
+ }
+ gss_release_buffer(&minor, &lbuffer);
+ if (*localname)
+ return 1;
+ return 0;
+ #else
+ debug("No generic gss_localname");
+ return 0;
+ #endif
+ }
+
+#ifdef HAVE_GSS_USEROK
+static ssh_gssapi_mech ssh_gssapi_generic_mech = {
+ NULL, NULL,
+ {0, NULL},
+ NULL, /* dochild */
+ ssh_gssapi_generic_userok,
+ ssh_gssapi_generic_localname,
+ NULL,
+ NULL};
+static const ssh_gssapi_mech *ssh_gssapi_generic_mech_ptr = &ssh_gssapi_generic_mech;
+#else /*HAVE_GSS_USEROK*/
+static const ssh_gssapi_mech *ssh_gssapi_generic_mech_ptr = NULL;
+#endif