extern int dbms_errno, mr_errcode;
+int max_version;
+
void do_call(client *cl);
void free_rtn_tuples(client *cp);
int retr_callback(int argc, char **argv, void *p_cl);
void do_retr(client *cl);
void do_access(client *cl);
void get_motd(client *cl);
+void do_version(client *cl);
char *procnames[] = {
"noop",
"dcm",
"motd",
"proxy",
+ "version",
+ "auth_krb5",
};
int newqueries;
{
com_err(whoami, 0, "procno out of range");
client_reply(cl, MR_UNKNOWN_PROC);
- mr_destroy_reply(cl->req);
- return;
+ goto out;
}
log_args(procnames[pn], 2, cl->req.mr_argc, cl->req.mr_argv);
{
client_reply(cl, MR_DOWN);
com_err(whoami, MR_DOWN, "(query refused)");
- mr_destroy_reply(cl->req);
- return;
+ goto out;
}
/* make sure this gets cleared before every operation */
case MR_PROXY:
do_proxy(cl);
break;
+
+ case MR_SETVERSION:
+ do_version(cl);
+ break;
+
+ case MR_KRB5_AUTH:
+ do_krb5_auth(cl);
+ break;
+
}
+
+out:
mr_destroy_reply(cl->req);
memset(&cl->req, 0, sizeof(mr_params));
}
com_err(whoami, 0, "Access check complete.");
}
+void do_version(client *cl)
+{
+ if (cl->req.mr_argc != 1)
+ {
+ client_reply(cl, MR_ARGS);
+ com_err(whoami, MR_ARGS, "incorrect number of arguments");
+ return;
+ }
+
+ cl->version = atoi(cl->req.mr_argv[0]);
+ if (cl->version == -1)
+ cl->version = max_version;
+
+ client_reply(cl, cl->version == max_version ? MR_SUCCESS :
+ cl->version < max_version ? MR_VERSION_LOW : MR_VERSION_HIGH);
+}
+
void get_motd(client *cl)
{
int motd;