make this actually work
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@8289 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -221,7 +221,7 @@ akf_next_entry(krb5_context context,
|
||||
goto out;
|
||||
}
|
||||
|
||||
entry->vno = (int8_t) kvno;
|
||||
entry->vno = kvno;
|
||||
|
||||
entry->keyblock.keytype = ETYPE_DES_CBC_MD5;
|
||||
entry->keyblock.keyvalue.length = 8;
|
||||
@@ -235,6 +235,8 @@ akf_next_entry(krb5_context context,
|
||||
ret = cursor->sp->fetch(cursor->sp, entry->keyblock.keyvalue.data, 8);
|
||||
if(ret != 8)
|
||||
ret = (ret < 0) ? errno : KRB5_KT_END;
|
||||
else
|
||||
ret = 0;
|
||||
|
||||
entry->timestamp = time(NULL);
|
||||
|
||||
@@ -261,6 +263,7 @@ akf_add_entry(krb5_context context,
|
||||
struct akf_data *d = id->data;
|
||||
int fd, created = 0;
|
||||
int32_t kvno;
|
||||
krb5_error_code ret;
|
||||
|
||||
fd = open (d->filename, O_RDWR | O_BINARY);
|
||||
if (fd < 0) {
|
||||
@@ -274,29 +277,68 @@ akf_add_entry(krb5_context context,
|
||||
if (entry->keyblock.keyvalue.length == 8
|
||||
&& entry->keyblock.keytype == ETYPE_DES_CBC_MD5) {
|
||||
|
||||
int32_t len = 0;
|
||||
int32_t len;
|
||||
krb5_storage *sp;
|
||||
|
||||
if (!created) {
|
||||
if (lseek (fd, 0, SEEK_SET))
|
||||
return errno;
|
||||
|
||||
if (read (fd, &len, sizeof(len)) != sizeof(len))
|
||||
return errno;
|
||||
sp = krb5_storage_from_fd(fd);
|
||||
if(sp == NULL) {
|
||||
close(fd);
|
||||
return ENOMEM;
|
||||
}
|
||||
len += 1;
|
||||
|
||||
if (lseek (fd, 0, SEEK_SET))
|
||||
if (created)
|
||||
len = 0;
|
||||
else {
|
||||
if((*sp->seek)(sp, 0, SEEK_SET) < 0) {
|
||||
krb5_storage_free(sp);
|
||||
close(fd);
|
||||
return errno;
|
||||
}
|
||||
|
||||
ret = krb5_ret_int32(sp, &len);
|
||||
if(ret) {
|
||||
krb5_storage_free(sp);
|
||||
close(fd);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
len++;
|
||||
|
||||
if((*sp->seek)(sp, 0, SEEK_SET) < 0) {
|
||||
krb5_storage_free(sp);
|
||||
close(fd);
|
||||
return errno;
|
||||
}
|
||||
|
||||
ret = krb5_store_int32(sp, len);
|
||||
if(ret) {
|
||||
krb5_storage_free(sp);
|
||||
close(fd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
if (write (fd, &len, sizeof(len)) != sizeof(len))
|
||||
if((*sp->seek)(sp, (len - 1) * (8 + 4), SEEK_CUR) < 0) {
|
||||
krb5_storage_free(sp);
|
||||
close(fd);
|
||||
return errno;
|
||||
|
||||
if (lseek (fd, 4 + (len-1) * (8+4), SEEK_SET))
|
||||
return errno;
|
||||
|
||||
kvno = entry->vno;
|
||||
write(fd, &kvno, sizeof(kvno));
|
||||
write(fd, entry->keyblock.keyvalue.data, 8);
|
||||
}
|
||||
|
||||
ret = krb5_store_int32(sp, entry->vno);
|
||||
if(ret) {
|
||||
krb5_storage_free(sp);
|
||||
close(fd);
|
||||
return ret;
|
||||
}
|
||||
ret = sp->store(sp, entry->keyblock.keyvalue.data,
|
||||
entry->keyblock.keyvalue.length);
|
||||
if(ret != entry->keyblock.keyvalue.length) {
|
||||
krb5_storage_free(sp);
|
||||
close(fd);
|
||||
if(ret < 0)
|
||||
return errno;
|
||||
return ENOTTY;
|
||||
}
|
||||
krb5_storage_free(sp);
|
||||
}
|
||||
close (fd);
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user