This patch adds an -xid predicate that can be used to find files belonging to a certain xid. diff -Naurp findutils-4.1.20.orig/configure.in findutils-4.1.20/configure.in --- findutils-4.1.20.orig/configure.in 2003-05-26 20:16:09.000000000 +0200 +++ findutils-4.1.20/configure.in 2005-02-20 02:03:27.000000000 +0100 @@ -101,6 +101,10 @@ gl_XALLOC dnl internationalization macros AM_GNU_GETTEXT +dnl vserver +AC_CHECK_LIB([vserver], [vc_get_iattr]) +AC_CHECK_TYPES([xid_t, nid_t]) + # This is necessary so that .o files in LIBOBJS are also built via # the ANSI2KNR-filtering rules. #LIBOBJS=`echo $LIBOBJS|sed 's/\.o /\$U.o /g;s/\.o$/\$U.o/'` diff -Naurp findutils-4.1.20.orig/find/defs.h findutils-4.1.20/find/defs.h --- findutils-4.1.20.orig/find/defs.h 2003-05-26 15:37:29.000000000 +0200 +++ findutils-4.1.20/find/defs.h 2005-02-20 02:03:06.000000000 +0100 @@ -382,6 +382,9 @@ boolean pred_type PARAMS((char *pathname boolean pred_uid PARAMS((char *pathname, struct stat *stat_buf, struct predicate *pred_ptr)); boolean pred_used PARAMS((char *pathname, struct stat *stat_buf, struct predicate *pred_ptr)); boolean pred_user PARAMS((char *pathname, struct stat *stat_buf, struct predicate *pred_ptr)); +#ifdef HAVE_LIBVSERVER +boolean pred_xid PARAMS((char *pathname, struct stat *stat_buf, struct predicate *pred_ptr)); +#endif boolean pred_xtype PARAMS((char *pathname, struct stat *stat_buf, struct predicate *pred_ptr)); char *find_pred_name PARAMS((PFB pred_func)); #ifdef DEBUG diff -Naurp findutils-4.1.20.orig/find/parser.c findutils-4.1.20/find/parser.c --- findutils-4.1.20.orig/find/parser.c 2003-05-24 20:36:25.000000000 +0200 +++ findutils-4.1.20/find/parser.c 2005-02-20 02:04:24.000000000 +0100 @@ -114,6 +114,9 @@ static boolean parse_used PARAMS((char * static boolean parse_user PARAMS((char *argv[], int *arg_ptr)); static boolean parse_version PARAMS((char *argv[], int *arg_ptr)); static boolean parse_xdev PARAMS((char *argv[], int *arg_ptr)); +#ifdef HAVE_LIBVSERVER +static boolean parse_xid PARAMS((char *argv[], int *arg_ptr)); +#endif static boolean parse_xtype PARAMS((char *argv[], int *arg_ptr)); static boolean insert_regex PARAMS((char *argv[], int *arg_ptr, boolean ignore_case)); @@ -216,6 +219,9 @@ static struct parser_table const parse_t {"version", parse_version}, /* GNU */ {"-version", parse_version}, /* GNU */ {"xdev", parse_xdev}, +#ifdef HAVE_LIBVSERVER + {"xid", parse_xid}, /* vserver */ +#endif {"xtype", parse_xtype}, /* GNU */ {0, 0} }; @@ -1202,6 +1208,53 @@ parse_xdev (char **argv, int *arg_ptr) return true; } +#ifdef HAVE_LIBVSERVER +#ifndef HAVE_XID_T +typedef unsigned int xid_t; +#endif +#ifndef HAVE_NID_T +typedef unsigned int nid_t; +#endif +#include + +static boolean +parse_xid (char **argv, int *arg_ptr) +{ + const char *ptr, *errstr; + xid_t xid; + struct predicate *our_pred; + + if (argv == NULL || argv[*arg_ptr] == NULL) + return (false); + + our_pred = insert_primary(pred_xid); + + ptr = argv[*arg_ptr]; + switch (*ptr) + { + case '+': + our_pred->args.info.kind = COMP_GT; + ptr++; + break; + case '-': + our_pred->args.info.kind = COMP_LT; + ptr++; + break; + default: + our_pred->args.info.kind = COMP_EQ; + break; + } + + xid = vc_xidopt2xid(ptr, true, &errstr); + if (xid == VC_NOCTX) + error(1, 0, _("invalid xid %s: %s"), quote(argv[*arg_ptr]), errstr); + our_pred->args.info.l_val = xid; + + (*arg_ptr)++; + return (true); +} +#endif + static boolean parse_xtype (char **argv, int *arg_ptr) { diff -Naurp findutils-4.1.20.orig/find/pred.c findutils-4.1.20/find/pred.c --- findutils-4.1.20.orig/find/pred.c 2003-05-24 20:36:25.000000000 +0200 +++ findutils-4.1.20/find/pred.c 2005-02-20 02:06:08.000000000 +0100 @@ -198,6 +198,9 @@ struct pred_assoc pred_table[] = {pred_used, "used "}, {pred_user, "user "}, {pred_xtype, "xtype "}, +#ifdef HAVE_LIBVSERVER + {pred_xid, "xid "}, +#endif {0, "none "} }; @@ -1204,6 +1207,42 @@ pred_user (char *pathname, struct stat * return (false); } +#ifdef HAVE_LIBVSERVER +#ifndef HAVE_XID_T +typedef unsigned int xid_t; +#endif +#ifndef HAVE_NID_T +typedef unsigned int nid_t; +#endif +#include + +boolean +pred_xid (char *pathname, struct stat *stat_buf, struct predicate *pred_ptr) +{ + xid_t xid; + + if ((xid = vc_getfilecontext(rel_pathname)) == VC_NOCTX) + return (false); + + switch (pred_ptr->args.info.kind) + { + case COMP_GT: + if (xid > pred_ptr->args.info.l_val) + return (true); + break; + case COMP_LT: + if (xid < pred_ptr->args.info.l_val) + return (true); + break; + case COMP_EQ: + if (xid == pred_ptr->args.info.l_val) + return (true); + break; + } + return (false); +} +#endif + boolean pred_xtype (char *pathname, struct stat *stat_buf, struct predicate *pred_ptr) {