krb5_fcc_close(id)
krb5_ccache id;
{
+ register int closeval = KRB5_OK;
+
if (OPENCLOSE(id)) {
- close(((krb5_fcc_data *) id->data)->fd);
+ closeval = close(((krb5_fcc_data *) id->data)->fd);
((krb5_fcc_data *) id->data)->fd = -1;
+ if (closeval == -1) {
+ closeval = krb5_fcc_interpret(errno);
+ } else
+ closeval = KRB5_OK;
+
}
xfree(((krb5_fcc_data *) id->data)->filename);
xfree(((krb5_fcc_data *) id->data));
xfree(id);
- return KRB5_OK;
+ return closeval;
}
struct stat buf;
unsigned long size;
char zeros[BUFSIZ];
- int ret, i;
+ register int ret, i;
if (OPENCLOSE(id)) {
ret = open(((krb5_fcc_data *) id->data)->filename, O_RDWR, 0);
if (ret < 0)
- return errno;
+ return krb5_fcc_interpret(errno);
((krb5_fcc_data *) id->data)->fd = ret;
}
else
lseek(((krb5_fcc_data *) id->data)->fd, 0, L_SET);
ret = unlink(((krb5_fcc_data *) id->data)->filename);
- if (ret < 0)
- return errno;
+ if (ret < 0) {
+ ret = krb5_fcc_interpret(errno);
+ if (OPENCLOSE(id)) {
+ (void) close(((krb5_fcc_data *)id->data)->fd);
+ ((krb5_fcc_data *) id->data)->fd = -1;
+ }
+ return ret;
+ }
ret = fstat(((krb5_fcc_data *) id->data)->fd, &buf);
- if (ret < 0)
- return errno;
+ if (ret < 0) {
+ ret = krb5_fcc_interpret(errno);
+ if (OPENCLOSE(id)) {
+ (void) close(((krb5_fcc_data *)id->data)->fd);
+ ((krb5_fcc_data *) id->data)->fd = -1;
+ }
+ return ret;
+ }
/* XXX This may not be legal XXX */
size = (unsigned long) buf.st_size;
bzero(zeros, BUFSIZ);
for (i=0; i < size / BUFSIZ; i++)
- if (write(((krb5_fcc_data *) id->data)->fd, zeros, BUFSIZ) < 0)
- return errno;
+ if (write(((krb5_fcc_data *) id->data)->fd, zeros, BUFSIZ) < 0) {
+ ret = krb5_fcc_interpret(errno);
+ if (OPENCLOSE(id)) {
+ (void) close(((krb5_fcc_data *)id->data)->fd);
+ ((krb5_fcc_data *) id->data)->fd = -1;
+ }
+ return ret;
+ }
- if (write(((krb5_fcc_data *) id->data)->fd, zeros, size % BUFSIZ) < 0)
- return errno;
+ if (write(((krb5_fcc_data *) id->data)->fd, zeros, size % BUFSIZ) < 0) {
+ ret = krb5_fcc_interpret(errno);
+ if (OPENCLOSE(id)) {
+ (void) close(((krb5_fcc_data *)id->data)->fd);
+ ((krb5_fcc_data *) id->data)->fd = -1;
+ }
+ return ret;
+ }
- close(((krb5_fcc_data *) id->data)->fd);
+ ret = close(((krb5_fcc_data *) id->data)->fd);
((krb5_fcc_data *) id->data)->fd = -1;
- return KRB5_OK;
+ if (ret)
+ ret = krb5_fcc_interpret(errno);
+
+ return ret;
}
* The filled in krb5_ccache id.
*
* Errors:
- * KRB5_NOMEM - there was insufficient memory to allocate the
+ * KRB5_CC_NOMEM - there was insufficient memory to allocate the
* krb5_ccache. id is undefined.
* system errors (from open)
*/
/* Allocate memory */
lid = (krb5_ccache) malloc(sizeof(struct _krb5_ccache));
if (lid == NULL)
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
lid->ops = &krb5_fcc_ops;
lid->data = (krb5_pointer) malloc(sizeof(krb5_fcc_data));
if (lid->data == NULL) {
xfree(lid);
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
}
((krb5_fcc_data *) lid->data)->filename = (char *)
if (((krb5_fcc_data *) lid->data)->filename == NULL) {
xfree(((krb5_fcc_data *) lid->data));
xfree(lid);
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
}
((krb5_fcc_data *) lid->data)->flags = 0;
/* Make sure the file name is reserved */
ret = open(((krb5_fcc_data *) lid->data)->filename, O_CREAT | O_EXCL, 0);
if (ret == -1)
- return errno;
+ return krb5_fcc_interpret(errno);
else {
/* Ignore user's umask, set mode = 0600 */
fchmod(ret, S_IREAD | S_IWRITE);
*
* Errors:
* system errors
- * KRB5_NOMEM
+ * KRB5_CC_NOMEM
*/
krb5_error_code
krb5_fcc_get_principal(id, princ)
if (OPENCLOSE(id)) {
ret = open(((krb5_fcc_data *) id->data)->filename, O_RDONLY, 0);
if (ret < 0)
- return errno;
+ return krb5_fcc_interpret(errno);
((krb5_fcc_data *) id->data)->fd = ret;
}
fcursor = (krb5_fcc_cursor *) *cursor;
ret = lseek(((krb5_fcc_data *) id->data)->fd, fcursor->pos, L_SET);
- if (ret < 0)
- return errno;
+ if (ret < 0) {
+ ret = krb5_fcc_interpret(errno);
+ if (OPENCLOSE(id)) {
+ (void) close(((krb5_fcc_data *)id->data)->fd);
+ ((krb5_fcc_data *)id->data)->fd = -1;
+ }
+ return ret;
+ }
kret = krb5_fcc_read_principal(id, &creds->client);
TCHECK(kret);
fcursor->pos = tell(((krb5_fcc_data *) id->data)->fd);
cursor = (krb5_cc_cursor *) fcursor;
+lose:
if (OPENCLOSE(id)) {
close(((krb5_fcc_data *) id->data)->fd);
((krb5_fcc_data *) id->data)->fd = -1;
}
-lose:
if (kret != KRB5_OK) {
if (creds->client)
krb5_free_principal(creds->client);
* Reads len bytes from the cache id, storing them in buf.
*
* Errors:
- * KRB5_EOF - there were not len bytes available
+ * KRB5_CC_END - there were not len bytes available
* system errors (read)
*/
krb5_error_code
ret = read(((krb5_fcc_data *) id->data)->fd, (char *) buf, len);
if (ret == -1)
- return errno;
+ return krb5_fcc_interpret(errno);
else if (ret != len)
- return KRB5_EOF;
+ return KRB5_CC_END;
else
return KRB5_OK;
}
*
* Errors:
* system errors (read errors)
- * KRB5_NOMEM
+ * KRB5_CC_NOMEM
*/
krb5_error_code
*/
*princ = (krb5_principal) calloc(length+1, sizeof(krb5_data *));
if (*princ == NULL)
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
for (i=0; i < length; i++) {
(*princ)[i] = (krb5_data *) malloc(sizeof(krb5_data));
if ((*princ)[i] == NULL) {
krb5_free_principal(*princ);
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
}
kret = krb5_fcc_read_data(id, (*princ)[i]);
CHECK(kret);
*/
*addrs = (krb5_address **) calloc(length+1, sizeof(krb5_address *));
if (*addrs == NULL)
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
for (i=0; i < length; i++) {
(*addrs)[i] = (krb5_address *) malloc(sizeof(krb5_address));
if ((*addrs)[i] == NULL) {
krb5_free_address(*addrs);
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
}
kret = krb5_fcc_read_addr(id, (*addrs)[i]);
CHECK(kret);
keyblock->contents = (unsigned char *) malloc(keyblock->length*
sizeof(krb5_octet));
if (keyblock->contents == NULL)
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
ret = read(((krb5_fcc_data *) id->data)->fd, (char *)keyblock->contents,
(keyblock->length)*sizeof(krb5_octet));
if (ret < 0) {
xfree(keyblock->contents);
- return errno;
+ return krb5_fcc_interpret(errno);
}
if (ret != (keyblock->length)*sizeof(krb5_octet)) {
xfree(keyblock->contents);
- return KRB5_EOF;
+ return KRB5_CC_END;
}
return KRB5_OK;
data->data = (char *) malloc(data->length);
if (data->data == NULL)
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
ret = read(((krb5_fcc_data *) id->data)->fd, (char *)data->data,
data->length);
if (ret == -1) {
xfree(data->data);
- return errno;
+ return krb5_fcc_interpret(errno);
}
if (ret != data->length) {
xfree(data->data);
- return KRB5_EOF;
+ return KRB5_CC_END;
}
return KRB5_OK;
errout:
addr->contents = (krb5_octet *) malloc(addr->length);
if (addr->contents == NULL)
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
ret = read(((krb5_fcc_data *) id->data)->fd, (char *)addr->contents,
(addr->length)*sizeof(krb5_octet));
if (ret == -1) {
xfree(addr->contents);
- return errno;
+ return krb5_fcc_interpret(errno);
}
if (ret != (addr->length)*sizeof(krb5_octet)) {
xfree(addr->contents);
- return KRB5_EOF;
+ return KRB5_CC_END;
}
return KRB5_OK;
errout:
* A filled in krb5_ccache structure "id".
*
* Errors:
- * KRB5_NOMEM - there was insufficient memory to allocate the
+ * KRB5_CC_NOMEM - there was insufficient memory to allocate the
* krb5_ccache. id is undefined.
* permission errors
*/
lid = (krb5_ccache) malloc(sizeof(struct _krb5_ccache));
if (lid == NULL)
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
lid->ops = &krb5_fcc_ops;
lid->data = (krb5_pointer) malloc(sizeof(krb5_fcc_data));
if (lid->data == NULL) {
xfree(lid);
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
}
((krb5_fcc_data *) lid->data)->filename = (char *)
if (((krb5_fcc_data *) lid->data)->filename == NULL) {
xfree(((krb5_fcc_data *) lid->data));
xfree(lid);
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
}
/* default to open/close on every trn */
* Errors:
* system errors
* permission errors
- * KRB5_NOMEM
+ * KRB5_CC_NOMEM
*/
krb5_error_code
krb5_fcc_retrieve(id, whichfields, mcreds, creds)
/* If we get here, a match wasn't found */
krb5_fcc_end_seq_get(id, &cursor);
- return KRB5_NOTFOUND;
+ return KRB5_CC_NOTFOUND;
}
static krb5_boolean
if (OPENCLOSE(id)) {
ret = open(((krb5_fcc_data *) id->data)->filename, O_RDONLY, 0);
if (ret < 0)
- return errno;
+ return krb5_fcc_interpret(errno);
((krb5_fcc_data *) id->data)->fd = ret;
}
}
* of the final krb5_fcc_end_seq_get, the results are undefined.
*
* Errors:
- * KRB5_NOMEM
+ * KRB5_CC_NOMEM
* system errors
*/
krb5_error_code
fcursor = (krb5_fcc_cursor *) malloc(sizeof(krb5_fcc_cursor));
if (fcursor == NULL)
- return KRB5_NOMEM;
+ return KRB5_CC_NOMEM;
/* Make sure we start reading right after the primary principal */
if (OPENCLOSE(id)) {
ret = open(((krb5_fcc_data *) id->data)->filename, O_RDONLY, 0);
if (ret < 0)
- return errno;
+ return krb5_fcc_interpret(errno);
((krb5_fcc_data *) id->data)->fd = ret;
}
else
ret = open(((krb5_fcc_data *) id->data)->filename,
O_RDWR | O_APPEND, 0);
if (ret < 0)
- return errno;
+ return krb5_fcc_interpret(errno);
((krb5_fcc_data *) id->data)->fd = ret;
}
ret = lseek(((krb5_fcc_data *) id->data)->fd, 0, L_XTND);
if (ret < 0)
- return errno;
+ return krb5_fcc_interpret(errno);
ret = krb5_fcc_store_principal(id, creds->client);
TCHECK(ret);
kret = krb5_fcc_start_seq_get(id, &cursor);
CHECK(kret, "start_seq_get");
kret = 0;
- while (kret != KRB5_EOF) {
+ while (kret != KRB5_CC_END) {
printf("Calling next_cred\n");
kret = krb5_fcc_next_cred(id, &cursor, &creds);
CHECK(kret, "next_cred");
ret = write(((krb5_fcc_data *)id->data)->fd, (char *) buf, len);
if (ret < 0)
- return errno;
+ return krb5_fcc_interpret(errno);
return KRB5_OK;
}
ret = write(((krb5_fcc_data *) id->data)->fd, (char *)keyblock->contents,
(keyblock->length)*sizeof(krb5_octet));
if (ret < 0)
- return errno;
+ return krb5_fcc_interpret(errno);
if (ret != (keyblock->length)*sizeof(krb5_octet))
- return KRB5_EOF;
+ return KRB5_CC_END;
return KRB5_OK;
}
ret = write(((krb5_fcc_data *) id->data)->fd, (char *)addr->contents,
(addr->length)*sizeof(krb5_octet));
if (ret < 0)
- return errno;
+ return krb5_fcc_interpret(errno);
if (ret != (addr->length)*sizeof(krb5_octet))
- return KRB5_EOF;
+ return KRB5_CC_END;
return KRB5_OK;
}
CHECK(ret);
ret = write(((krb5_fcc_data *) id->data)->fd, data->data, data->length);
if (ret == -1)
- return errno;
+ return krb5_fcc_interpret(errno);
return KRB5_OK;
}