nfsd: pass client principal name in rsc downcall
[linux-2.6-block.git] / net / sunrpc / auth_gss / svcauth_gss.c
index 12803da95dc4c6c3fed98d2dfa70d2335135f03d..e9baa6ebb1dd2ed5ec445792ee3fa5c98e920247 100644 (file)
@@ -332,6 +332,7 @@ struct rsc {
        struct svc_cred         cred;
        struct gss_svc_seq_data seqdata;
        struct gss_ctx          *mechctx;
+       char                    *client_name;
 };
 
 static struct cache_head *rsc_table[RSC_HASHMAX];
@@ -346,6 +347,7 @@ static void rsc_free(struct rsc *rsci)
                gss_delete_sec_context(&rsci->mechctx);
        if (rsci->cred.cr_group_info)
                put_group_info(rsci->cred.cr_group_info);
+       kfree(rsci->client_name);
 }
 
 static void rsc_put(struct kref *ref)
@@ -383,6 +385,7 @@ rsc_init(struct cache_head *cnew, struct cache_head *ctmp)
        tmp->handle.data = NULL;
        new->mechctx = NULL;
        new->cred.cr_group_info = NULL;
+       new->client_name = NULL;
 }
 
 static void
@@ -397,6 +400,8 @@ update_rsc(struct cache_head *cnew, struct cache_head *ctmp)
        spin_lock_init(&new->seqdata.sd_lock);
        new->cred = tmp->cred;
        tmp->cred.cr_group_info = NULL;
+       new->client_name = tmp->client_name;
+       tmp->client_name = NULL;
 }
 
 static struct cache_head *
@@ -486,6 +491,15 @@ static int rsc_parse(struct cache_detail *cd,
                status = gss_import_sec_context(buf, len, gm, &rsci.mechctx);
                if (status)
                        goto out;
+
+               /* get client name */
+               len = qword_get(&mesg, buf, mlen);
+               if (len > 0) {
+                       rsci.client_name = kstrdup(buf, GFP_KERNEL);
+                       if (!rsci.client_name)
+                               goto out;
+               }
+
        }
        rsci.h.expiry_time = expiry;
        rscp = rsc_update(&rsci, rscp);
@@ -913,6 +927,15 @@ struct gss_svc_data {
        struct rsc                      *rsci;
 };
 
+char *svc_gss_principal(struct svc_rqst *rqstp)
+{
+       struct gss_svc_data *gd = (struct gss_svc_data *)rqstp->rq_auth_data;
+
+       if (gd && gd->rsci)
+               return gd->rsci->client_name;
+       return NULL;
+}
+
 static int
 svcauth_gss_set_client(struct svc_rqst *rqstp)
 {