[OpenAFS-devel] Simplifying rxgen output

Simon Wilkinson sxw@inf.ed.ac.uk
Sat, 13 Feb 2010 09:48:38 +0000


I've been recently playing around a lot with the output from rxgen, and =
am finding the structures it builds cumbersome and ugly - in particular =
when dealing with opaques, vectors and unions.

Take, for example, the following section of xg:

struct test {
   opaque mydata;
};
union testgroup switch (afs_int32 type) {
    case 0:
        test firstDataSet;
};

This produces the following output as standard:
struct test {
        struct mydata {
                u_int mydata_len;
                char *mydata_val;
        } mydata;
};
typedef struct test test;

struct testgroup {
        afs_int32 type;
        union {
                test firstDataSet;
        } testgroup_u;
};
typedef struct testgroup testgroup;

There's a couple of problems here. The first is that access elements of =
the opaque is very cumbersome. With 'example' being an instance of =
struct testgroup, we have:

example.testgroup_u.firstDataSet.mydata.mydata_val;

I'd like to change this so we can use

example.u.firstDataSet.mydata.val

by removing the name of the structure in the union declaration, and in =
the len and val attributes of any vector.

The second problem is that in the 'test' example above, the name of the =
element (in this case mydata) has also been used to name the structure. =
This means that every opaque is tied to the name it was called in a =
particular structure - you can't copy opaques between structures without =
explicit, ugly, casts. I'd like to proposed that we use the same =
approach as Heimdal, and actually define ...

struct rxgen_opaque {
    u_int len;
    char * val;
}

... and use this in the XDR whenever opaques are required.

I know that these changes aren't backwards compatible, and may break =
out-of-tree users, so I'm proposing that they're only done if a new flag =
is supplied to rxgen - I'm considering using '-b' (for "brief")

Comments?

Simon.=