From 78ac47f052a8f3c51759dc9ed970b4d420b0545d Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Tue, 6 Jan 1998 03:24:20 +0000 Subject: [PATCH] add kadm5_server_{send,recv}{,_sp} git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@4283 ec53bebd-3082-4978-b11e-865c3cabbd6b --- kadmin/server.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++ lib/kadm5/server.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+) diff --git a/kadmin/server.c b/kadmin/server.c index 7212df5ff..1bd1bae70 100644 --- a/kadmin/server.c +++ b/kadmin/server.c @@ -40,6 +40,96 @@ RCSID("$Id$"); +kadm5_ret_t +kadm5_server_send_sp(krb5_context context, krb5_auth_context ac, + krb5_storage *sp, int fd) +{ + unsigned char buf[1024]; + size_t len; + krb5_data in; + + len = sp->seek(sp, 0, SEEK_CUR); + sp->seek(sp, 0, SEEK_SET); + if(len > sizeof(buf)) + return ENOMEM; + sp->fetch(sp, buf, len); + in.data = buf; + in.length = len; + return kadm5_server_send(context, ac, &in, fd); +} + +kadm5_ret_t +kadm5_server_send(krb5_context context, krb5_auth_context ac, + krb5_data *data, int fd) +{ + unsigned char buf[4]; + kadm5_ret_t ret; + krb5_data out; + + ret = krb5_mk_priv(context, ac, data, &out, NULL); + if(ret) + return ret; + buf[0] = (out.length >> 24) & 0xff; + buf[1] = (out.length >> 16) & 0xff; + buf[2] = (out.length >> 8) & 0xff; + buf[3] = out.length & 0xff; + krb5_net_write(context, &fd, buf, 4); + krb5_net_write(context, &fd, out.data, out.length); + krb5_data_free(&out); + return 0; +} + +kadm5_ret_t +kadm5_server_recv(krb5_context context, krb5_auth_context ac, + krb5_data *out, int fd) +{ + unsigned char buf[1024]; + size_t len; + krb5_data in; + kadm5_ret_t ret; + + ret = krb5_net_read(context, &fd, buf, 4); + if(ret == 0) + exit(1); + if(ret < 0) + krb5_err(context, 1, errno, "krb5_net_read"); + if(ret != 4) + krb5_errx(context, 1, "krb5_net_read(4) = %d", ret); + len = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; + if(len > sizeof(buf)) + return ENOMEM; + ret = krb5_net_read(context, &fd, buf, len); + if(ret < 0) + krb5_err(context, 1, errno, "krb5_net_read"); + if(ret != len) + krb5_errx(context, 1, "krb5_net_read(%d) = %d", len, ret); + + in.data = buf; + in.length = len; + ret = krb5_rd_priv(context, ac, &in, out, NULL); + if(ret) + return ret; + else + return 0; +} + +kadm5_ret_t +kadm5_server_recv_sp(krb5_context context, krb5_auth_context ac, + krb5_storage *sp, int fd) +{ + kadm5_ret_t ret; + krb5_data data; + + ret = kadm5_server_recv (context, ac, &data, fd); + if (ret) + return ret; + + sp->store(sp, data.data, data.length); + sp->seek(sp, 0, SEEK_SET); + krb5_data_free(&data); + return 0; +} + kadm5_ret_t kadmind_dispatch(void *kadm_handle, krb5_storage *sp) { diff --git a/lib/kadm5/server.c b/lib/kadm5/server.c index 7212df5ff..1bd1bae70 100644 --- a/lib/kadm5/server.c +++ b/lib/kadm5/server.c @@ -40,6 +40,96 @@ RCSID("$Id$"); +kadm5_ret_t +kadm5_server_send_sp(krb5_context context, krb5_auth_context ac, + krb5_storage *sp, int fd) +{ + unsigned char buf[1024]; + size_t len; + krb5_data in; + + len = sp->seek(sp, 0, SEEK_CUR); + sp->seek(sp, 0, SEEK_SET); + if(len > sizeof(buf)) + return ENOMEM; + sp->fetch(sp, buf, len); + in.data = buf; + in.length = len; + return kadm5_server_send(context, ac, &in, fd); +} + +kadm5_ret_t +kadm5_server_send(krb5_context context, krb5_auth_context ac, + krb5_data *data, int fd) +{ + unsigned char buf[4]; + kadm5_ret_t ret; + krb5_data out; + + ret = krb5_mk_priv(context, ac, data, &out, NULL); + if(ret) + return ret; + buf[0] = (out.length >> 24) & 0xff; + buf[1] = (out.length >> 16) & 0xff; + buf[2] = (out.length >> 8) & 0xff; + buf[3] = out.length & 0xff; + krb5_net_write(context, &fd, buf, 4); + krb5_net_write(context, &fd, out.data, out.length); + krb5_data_free(&out); + return 0; +} + +kadm5_ret_t +kadm5_server_recv(krb5_context context, krb5_auth_context ac, + krb5_data *out, int fd) +{ + unsigned char buf[1024]; + size_t len; + krb5_data in; + kadm5_ret_t ret; + + ret = krb5_net_read(context, &fd, buf, 4); + if(ret == 0) + exit(1); + if(ret < 0) + krb5_err(context, 1, errno, "krb5_net_read"); + if(ret != 4) + krb5_errx(context, 1, "krb5_net_read(4) = %d", ret); + len = (buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; + if(len > sizeof(buf)) + return ENOMEM; + ret = krb5_net_read(context, &fd, buf, len); + if(ret < 0) + krb5_err(context, 1, errno, "krb5_net_read"); + if(ret != len) + krb5_errx(context, 1, "krb5_net_read(%d) = %d", len, ret); + + in.data = buf; + in.length = len; + ret = krb5_rd_priv(context, ac, &in, out, NULL); + if(ret) + return ret; + else + return 0; +} + +kadm5_ret_t +kadm5_server_recv_sp(krb5_context context, krb5_auth_context ac, + krb5_storage *sp, int fd) +{ + kadm5_ret_t ret; + krb5_data data; + + ret = kadm5_server_recv (context, ac, &data, fd); + if (ret) + return ret; + + sp->store(sp, data.data, data.length); + sp->seek(sp, 0, SEEK_SET); + krb5_data_free(&data); + return 0; +} + kadm5_ret_t kadmind_dispatch(void *kadm_handle, krb5_storage *sp) {