[OpenAFS] OpenAFS API / Documentation?
Kirk Patton
kpatton@transmeta.com
Fri, 8 Dec 2006 10:49:13 -0800
Hello Jeff,
Thanks for the code. I will take a look and see where it takes me. :-)
Kirk
On Fri, Dec 08, 2006 at 01:43:11PM -0500, Jeffrey B. Woodward wrote:
> Kirk,
>
> This reminds me of a project that a colleague, Jed Dobson, and I worked
> on at Dartmouth College approximately 2.5 yrs ago. Unfortunately, I
> don't remember all the details, but essentially all we did was enable
> the AFS feature in SGE and wrote some simple code to write the token to
> stdout and then another small program to read it in. Attached are said
> programs.
>
> Your mileage may vary as this is oldish code, but I hope this helps (and
> special thanks to Jed for digging up our old code from the archives).
>
> -Woody
>
>
> Kirk Patton wrote:
> > Hello,
> >
> > I am working on a small C program that needs to klog on behalf of a user.
> > We are running Sun Grid Engine and AFS. In order for a SGE job to access
> > AFS space, SGE needs to be able to switch to the users ID and authenticate
> > to AFS.
> >
> > I was wondering if there are any tutorials/howto's or references that
> > could be of help.
> >
> > Thanks,
> > Kirk
> >
> >
>
> /*
> * GetToken.c: read a token from the Cache Manager and write to a file.
> *
> * $Id: GetToken.c,v 1.1 2003/04/15 13:41:15 jed Exp jed $
> *
> */
>
> #include <unistd.h>
> #include <stdlib.h>
> #include <stddef.h>
> #include <stdio.h>
> #include <strings.h> /* bzero lives in either string.h or strings.h...sigh */
> #include <string.h>
> #include <netinet/in.h>
> #include <errno.h>
>
> #include <afs/param.h>
>
> #include <afs/stds.h>
> #include <afs/afsutil.h>
> #include <afs/auth.h>
>
>
> extern int ktc_GetToken(struct ktc_principal *aserver,
> struct ktc_token *atoken,
> int atokenLen,
> struct ktc_principal *aclient);
>
> extern int ktc_ListTokens(int aprevIndex,
> int* aindex, struct ktc_principal *aserver);
>
>
> int main(int argc, char* argv[])
> {
> int cellIndex, newIndex;
> for (cellIndex = 0 ; ; cellIndex = newIndex) {
> struct ktc_principal server;
> struct ktc_principal client;
> struct ktc_token token;
> int rc;
>
> bzero(&server, sizeof(struct ktc_principal));
> bzero(&client, sizeof(struct ktc_principal));
> bzero(&token, sizeof(struct ktc_token));
>
> /* fetch server principal */
> rc = ktc_ListTokens(cellIndex, &newIndex, &server);
>
> /*
> fprintf(stderr, "cellIndex = %d, newIndex = %d, rc = %d (%d)\n",
> cellIndex,
> newIndex,
> rc,
> KTC_NOENT);
> */
>
> if (rc) {
> if (rc == KTC_NOENT) {
> /* no more tokens */
> break;
> } else {
> /* some error occured */
> perror("ktc_ListTokens failed fetching original tokens");
> exit(1);
> }
> }
>
> rc = ktc_GetToken(&server,
> &token, sizeof(struct ktc_token),
> &client);
>
> if (rc) {
> printf("error: couldn't get token!\n");
> exit(255);
> }
>
>
> /*
> * Fix up endian issues. Only the ktc_token structure has
> * problems...we will make all field network byte-order...
> */
>
> token.startTime = htonl(token.startTime);
> token.endTime = htonl(token.endTime);
> token.kvno = htons(token.kvno);
> token.ticketLen = htonl(token.ticketLen);
>
>
> /*
> * Puke out the token
> */
>
> write(STDOUT_FILENO, &server, sizeof(struct ktc_principal));
> write(STDOUT_FILENO, &client, sizeof(struct ktc_principal));
> write(STDOUT_FILENO, &token, sizeof(struct ktc_token));
> }
>
> exit(0);
> }
>
> /*
> * SetToken.c: read a token from a file and load into Cache Manager.
> *
> * $Id: SetToken.c,v 1.1 2003/04/15 13:41:38 jed Exp jed $
> *
> */
>
> #include <unistd.h>
> #include <stdlib.h>
> #include <stddef.h>
> #include <stdio.h>
> #include <string.h> /* bzero lives in either string.h or strings.h...sigh */
> #include <strings.h>
> #include <netinet/in.h>
> #include <errno.h>
>
> #include <afs/param.h>
>
> #include <afs/stds.h>
> #include <afs/afsutil.h>
> #include <afs/auth.h>
>
>
> extern int ktc_SetToken(struct ktc_principal *aserver,
> struct ktc_token *atoken,
> struct ktc_principal *aclient,
> int flags);
>
>
>
> int readn(int fd, void *vptr, size_t n)
> {
> size_t nleft;
> ssize_t nread;
> char *ptr;
>
> ptr = vptr;
> nleft = n;
> while (nleft > 0) {
> if ( (nread = read(fd, ptr, nleft)) < 0) {
> if (errno == EINTR)
> nread = 0; /* and call read() again */
> else
> return(-1);
> } else if (nread == 0)
> break; /* EOF */
>
> nleft -= nread;
> ptr += nread;
> }
> return(n - nleft); /* return >= 0 */
> }
>
>
>
> int main(int argc, char* argv[])
> {
> struct ktc_principal server;
> struct ktc_principal client;
> struct ktc_token token;
>
>
> for ( ; ; ) {
> int nbytes, rc;
>
> nbytes = readn(STDIN_FILENO, &server, sizeof(struct ktc_principal));
> if (nbytes == 0) break; /* EOF */
> if (nbytes < 0) {
> perror("truncated nread getting server struct");
> exit(1);
> }
>
> nbytes = readn(STDIN_FILENO, &client, sizeof(struct ktc_principal));
> if (nbytes <= 0) {
> perror("truncated nread getting client struct");
> exit(1);
> }
>
> nbytes = readn(STDIN_FILENO, &token, sizeof(struct ktc_token));
> if (nbytes <= 0) {
> perror("truncated nread getting token struct");
> exit(1);
> }
>
>
> /*
> * Fix up endian issues. Only the ktc_token structure has
> * problems...we will receive everything in network byte-order,
> * so we convert back to host convention now...
> */
>
> token.startTime = ntohl(token.startTime);
> token.endTime = ntohl(token.endTime);
> token.kvno = ntohs(token.kvno);
> token.ticketLen = ntohl(token.ticketLen);
>
>
> /*
> * Set the token
> */
> rc = ktc_SetToken(&server, &token, &client, 0);
>
> if (rc) {
> perror("ktc_SetToken failed reinstalling tokens");
> exit(1);
> }
> }
>
> exit(0);
> }
--
Kirk Patton
Unix Administrator
Transmeta Inc.
Tel. 408 919-3055