#include <moira.h>
#include "update.h"
+#include <errno.h>
#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_KRB4
#include <des.h>
-#include <gdb.h>
#include <krb.h>
+#endif
+#include <krb5.h>
RCSID("$Header$");
-extern int dbg;
-extern C_Block session;
+#ifdef HAVE_KRB4
+extern des_cblock session;
+#endif
+extern char *whoami;
+extern krb5_context context;
-CONNECTION conn;
+int mr_send_krb5_auth(int conn, char *host_name)
+{
+ krb5_data auth;
+ int code;
+ long response;
+
+ memset(&auth, 0, sizeof(auth));
+
+ code = get_mr_krb5_update_ticket(host_name, &auth);
+ if (code)
+ goto out;
+ code = send_string(conn, "AUTH_003", 9);
+ if (code)
+ goto out;
+ code = recv_int(conn, &response);
+ if (code)
+ goto out;
+ if (response)
+ {
+ /* Talking to a server that doesn't do AUTH_003 */
+ krb5_free_data_contents(context, &auth);
+ return response;
+ }
+ code = send_string(conn, (char *)auth.data, auth.length);
+ if (code)
+ goto out;
+ code = recv_int(conn, &response);
+ if (code)
+ goto out;
+ if (response)
+ {
+ krb5_free_data_contents(context, &auth);
+ return response;
+ }
-int send_auth(char *host_name)
+ return MR_SUCCESS;
+
+ out:
+ krb5_free_data_contents(context, &auth);
+ return code;
+}
+
+int mr_send_auth(int conn, char *host_name)
{
+#ifdef HAVE_KRB4
KTEXT_ST ticket_st;
- KTEXT ticket = &ticket_st;
- STRING data;
- int code;
- int response;
- int auth_version = 2;
+ int code, auth_version = 2;
+ long response;
- code = get_mr_update_ticket(host_name, ticket);
+ code = get_mr_update_ticket(host_name, &ticket_st);
if (code)
return code;
- STRING_DATA(data) = "AUTH_002";
- MAX_STRING_SIZE(data) = 9;
- code = send_object(conn, (char *)&data, STRING_T);
+ code = send_string(conn, "AUTH_002", 9);
if (code)
- return connection_errno(conn);
- code = receive_object(conn, (char *)&response, INTEGER_T);
+ return code;
+ code = recv_int(conn, &response);
if (code)
- return connection_errno(conn);
+ return code;
if (response)
{
- STRING_DATA(data) = "AUTH_001";
- MAX_STRING_SIZE(data) = 9;
- code = send_object(conn, (char *)&data, STRING_T);
+ code = send_string(conn, "AUTH_001", 9);
if (code)
- return connection_errno(conn);
- code = receive_object(conn, (char *)&response, INTEGER_T);
+ return code;
+ code = recv_int(conn, &response);
if (code)
- return connection_errno(conn);
+ return code;
if (response)
return response;
auth_version = 1;
}
- STRING_DATA(data) = (char *)ticket->dat;
- MAX_STRING_SIZE(data) = ticket->length;
- code = send_object(conn, (char *)&data, STRING_T);
+ code = send_string(conn, (char *)ticket_st.dat, ticket_st.length);
if (code)
- return connection_errno(conn);
- code = receive_object(conn, (char *)&response, INTEGER_T);
+ return code;
+ code = recv_int(conn, &response);
if (code)
- return connection_errno(conn);
+ return code;
if (response)
return response;
{
des_key_schedule sched;
C_Block enonce;
+ char *data;
+ size_t size;
- code = receive_object(conn, (char *)&data, STRING_T);
+ code = recv_string(conn, &data, &size);
if (code)
- return connection_errno(conn);
+ return code;
des_key_sched(session, sched);
- des_ecb_encrypt(STRING_DATA(data), enonce, sched, 1);
- STRING_DATA(data) = enonce;
- code = send_object(conn, (char *)&data, STRING_T);
+ des_ecb_encrypt(data, enonce, sched, 1);
+ free(data);
+ code = send_string(conn, (char *)enonce, sizeof(enonce));
if (code)
- return connection_errno(conn);
- code = receive_object(conn, (char *)&response, INTEGER_T);
+ return code;
+ code = recv_int(conn, &response);
if (code)
- return connection_errno(conn);
+ return code;
if (response)
return response;
}
return MR_SUCCESS;
+#else
+ return MR_NO_KRB4;
+#endif
}
-int execute(char *path)
+int mr_execute(int conn, char *path)
{
- int response;
- STRING data;
+ long response;
+ char *data;
int code;
- string_alloc(&data, BUFSIZ);
- sprintf(STRING_DATA(data), "EXEC_002 %s", path);
- code = send_object(conn, (char *)&data, STRING_T);
+ data = malloc(10 + strlen(path));
+ if (!data)
+ return ENOMEM;
+ sprintf(data, "EXEC_002 %s", path);
+ code = send_string(conn, data, strlen(data) + 1);
+ free(data);
if (code)
- return connection_errno(conn);
- code = receive_object(conn, (char *)&response, INTEGER_T);
+ return code;
+ code = recv_int(conn, &response);
if (code)
- return connection_errno(conn);
+ return code;
if (response)
return response;
+
return MR_SUCCESS;
}
-void send_quit(void)
+void mr_send_quit(int conn)
+{
+ send_string(conn, "quit", 5);
+}
+
+void fail(int conn, int err, char *msg)
{
- STRING str;
- if (!conn)
- return;
- string_alloc(&str, 5);
- strcpy(STRING_DATA(str), "quit");
- send_object(conn, (char *)&str, STRING_T);
- string_free(&str);
+ com_err(whoami, err, msg);
+ return;
}