krb5_error_code KRB5_CALLCONV krb5_get_init_creds_opt_set_fast_ccache(krb5_context context, krb5_get_init_creds_opt *opt, krb5_ccache ccache) { krb5_error_code retval = 0; struct k5buf buf; char *cc_name; krb5int_buf_init_dynamic(&buf); krb5int_buf_add(&buf, krb5_cc_get_type(context, ccache)); krb5int_buf_add(&buf, ":"); krb5int_buf_add(&buf, krb5_cc_get_name(context, ccache)); cc_name = krb5int_buf_data(&buf); if (cc_name) retval = krb5_get_init_creds_opt_set_fast_ccache_name(context, opt, cc_name); else retval = ENOMEM; krb5int_free_buf(&buf); return retval; }
static krb5_error_code krb5_rc_io_store(krb5_context context, struct dfl_data *t, krb5_donot_replay *rep) { size_t clientlen, serverlen; unsigned int len; krb5_error_code ret; struct k5buf buf, extbuf; char *ptr, *extstr; clientlen = strlen(rep->client); serverlen = strlen(rep->server); if (rep->msghash) { /* * Write a hash extension record, to be followed by a record * in regular format (without the message hash) for the * benefit of old implementations. */ /* Format the extension value so we know its length. */ krb5int_buf_init_dynamic(&extbuf); krb5int_buf_add_fmt(&extbuf, "HASH:%s %lu:%s %lu:%s", rep->msghash, (unsigned long) clientlen, rep->client, (unsigned long) serverlen, rep->server); extstr = krb5int_buf_data(&extbuf); if (!extstr) return KRB5_RC_MALLOC; /* * Put the extension value into the server field of a * regular-format record, with an empty client field. */ krb5int_buf_init_dynamic(&buf); len = 1; krb5int_buf_add_len(&buf, (char *) &len, sizeof(len)); krb5int_buf_add_len(&buf, "", 1); len = strlen(extstr) + 1; krb5int_buf_add_len(&buf, (char *) &len, sizeof(len)); krb5int_buf_add_len(&buf, extstr, len); krb5int_buf_add_len(&buf, (char *) &rep->cusec, sizeof(rep->cusec)); krb5int_buf_add_len(&buf, (char *) &rep->ctime, sizeof(rep->ctime)); free(extstr); } else /* No extension record needed. */ krb5int_buf_init_dynamic(&buf); len = clientlen + 1; krb5int_buf_add_len(&buf, (char *) &len, sizeof(len)); krb5int_buf_add_len(&buf, rep->client, len); len = serverlen + 1; krb5int_buf_add_len(&buf, (char *) &len, sizeof(len)); krb5int_buf_add_len(&buf, rep->server, len); krb5int_buf_add_len(&buf, (char *) &rep->cusec, sizeof(rep->cusec)); krb5int_buf_add_len(&buf, (char *) &rep->ctime, sizeof(rep->ctime)); ptr = krb5int_buf_data(&buf); if (ptr == NULL) return KRB5_RC_MALLOC; ret = krb5_rc_io_write(context, &t->d, ptr, krb5int_buf_len(&buf)); krb5int_free_buf(&buf); return ret; }
void krb5int_debug_fprint (const char *fmt, ...) { #ifdef DEBUG va_list args; /* Temporaries for variable arguments, etc. */ krb5_error_code kerr; int err; fd_set *rfds, *wfds, *xfds; int i; int maxfd; struct timeval *tv; struct addrinfo *ai; const krb5_data *d; char addrbuf[NI_MAXHOST], portbuf[NI_MAXSERV]; const char *p; #ifndef max #define max(a,b) ((a) > (b) ? (a) : (b)) #endif char tmpbuf[max(NI_MAXHOST + NI_MAXSERV + 30, 200)]; struct k5buf buf; if (!krb5int_debug_sendto_kdc) return; va_start(args, fmt); #define putf(FMT,X) (snprintf(tmpbuf,sizeof(tmpbuf),FMT,X),putstr(tmpbuf)) for (; *fmt; fmt++) { if (*fmt != '%') { const char *fmt2; size_t len; for (fmt2 = fmt+1; *fmt2; fmt2++) if (*fmt2 == '%') break; len = fmt2 - fmt; put(fmt, len); fmt += len - 1; /* then fmt++ in loop header */ continue; } /* After this, always processing a '%' sequence. */ fmt++; switch (*fmt) { case 0: default: abort(); case 'E': /* %E => krb5_error_code */ kerr = va_arg(args, krb5_error_code); snprintf(tmpbuf, sizeof(tmpbuf), "%lu/", (unsigned long) kerr); putstr(tmpbuf); p = error_message(kerr); putstr(p); break; case 'm': /* %m => errno value (int) */ /* Like syslog's %m except the errno value is passed in rather than the current value. */ err = va_arg(args, int); putf("%d/", err); p = NULL; #ifdef HAVE_STRERROR_R if (strerror_r(err, tmpbuf, sizeof(tmpbuf)) == 0) p = tmpbuf; #endif if (p == NULL) p = strerror(err); putstr(p); break; case 'F': /* %F => fd_set *, fd_set *, fd_set *, int */ rfds = va_arg(args, fd_set *); wfds = va_arg(args, fd_set *); xfds = va_arg(args, fd_set *); maxfd = va_arg(args, int); for (i = 0; i < maxfd; i++) { int r = FD_ISSET(i, rfds); int w = wfds && FD_ISSET(i, wfds); int x = xfds && FD_ISSET(i, xfds); if (r || w || x) { putf(" %d", i); if (r) putstr("r"); if (w) putstr("w"); if (x) putstr("x"); } } putstr(" "); break; case 's': /* %s => char * */ p = va_arg(args, const char *); putstr(p); break; case 't': /* %t => struct timeval * */ tv = va_arg(args, struct timeval *); if (tv) { snprintf(tmpbuf, sizeof(tmpbuf), "%ld.%06ld", (long) tv->tv_sec, (long) tv->tv_usec); putstr(tmpbuf); } else putstr("never"); break; case 'd': /* %d => int */ putf("%d", va_arg(args, int)); break; case 'p': /* %p => pointer */ putf("%p", va_arg(args, void*)); break; case 'A': /* %A => addrinfo */ ai = va_arg(args, struct addrinfo *); krb5int_buf_init_dynamic(&buf); if (ai->ai_socktype == SOCK_DGRAM) krb5int_buf_add(&buf, "dgram"); else if (ai->ai_socktype == SOCK_STREAM) krb5int_buf_add(&buf, "stream"); else krb5int_buf_add_fmt(&buf, "socktype%d", ai->ai_socktype); if (0 != getnameinfo (ai->ai_addr, ai->ai_addrlen, addrbuf, sizeof (addrbuf), portbuf, sizeof (portbuf), NI_NUMERICHOST | NI_NUMERICSERV)) { if (ai->ai_addr->sa_family == AF_UNSPEC) krb5int_buf_add(&buf, " AF_UNSPEC"); else krb5int_buf_add_fmt(&buf, " af%d", ai->ai_addr->sa_family); } else krb5int_buf_add_fmt(&buf, " %s.%s", addrbuf, portbuf); if (krb5int_buf_data(&buf)) putstr(krb5int_buf_data(&buf)); krb5int_free_buf(&buf); break; case 'D': /* %D => krb5_data * */ d = va_arg(args, krb5_data *); /* may not be nul-terminated */ put(d->data, d->length); break; } } va_end(args); #endif }