#include <getopt.h>
#include <stdint.h>
+#include <errno.h>
+#define ENSC_WRAPPERS_PREFIX "vattribute: "
#define ENSC_WRAPPERS_VSERVER 1
+#define ENSC_WRAPPERS_UNISTD 1
#include <wrappers.h>
#define CMD_HELP 0x1000
#define CMD_VERSION 0x1001
#define CMD_XID 0x2000
#define CMD_SET 0x2001
-#define CMD_CAP 0x2002
+#define CMD_CCAP 0x2002
#define CMD_FLAG 0x2003
#define CMD_SECURE 0x2004
+#define CMD_BCAP 0x2005
int wrapper_exit_code = 1;
{ "version", no_argument, 0, CMD_VERSION },
{ "xid", required_argument, 0, CMD_XID },
{ "set", no_argument, 0, CMD_SET },
- { "cap", required_argument, 0, CMD_CAP },
+ { "ccap", required_argument, 0, CMD_CCAP },
+ { "bcap", required_argument, 0, CMD_BCAP },
{ "flag", required_argument, 0, CMD_FLAG },
{ "secure", no_argument, 0, CMD_SECURE },
{0,0,0,0}
struct Arguments {
xid_t xid;
struct vc_ctx_flags flags;
- struct vc_ctx_flags caps;
+ struct vc_ctx_caps caps;
};
static void
WRITE_MSG(fd, "Usage:\n ");
WRITE_STR(fd, cmd);
WRITE_MSG(fd,
- " --set [--xid <xid>] [--cap [~!]<cap>] [--flag [~!]<flag>] [--secure] -- [<program> <args>*]\n"
+ " --set [--xid <xid>] [--bcap [~!]<cap>] [--ccap [~!]<cap>] [--flag [~!]<flag>] [--secure] -- [<program> <args>*]\n"
"\n"
"Please report bugs to " PACKAGE_BUGREPORT "\n");
}
static void
-setFlags(char const UNUSED *str, struct vc_ctx_flags UNUSED * flags)
+parseFlags(char const *str, struct vc_ctx_flags *flags)
{
- abort();
+ struct vc_err_listparser err;
+ int rc;
+
+ rc = vc_list2flag(str,0, &err, flags);
+
+ if (rc==-1) {
+ WRITE_MSG(2, "Unknown flag '");
+ write(2, err.ptr, err.len);
+ WRITE_MSG(2, "'\n");
+ exit(wrapper_exit_code);
+ }
}
static void
-setCaps(char const UNUSED *str, struct vc_ctx_flags UNUSED * caps)
+parseBCaps(char const *str, struct vc_ctx_caps *caps)
{
- abort();
+ struct vc_err_listparser err;
+ int rc;
+
+ rc = vc_list2bcap(str,0, &err, caps);
+
+ if (rc==-1) {
+ WRITE_MSG(2, "Unknown bcap '");
+ write(2, err.ptr, err.len);
+ WRITE_MSG(2, "'\n");
+ exit(wrapper_exit_code);
+ }
}
static void
-setSecure(struct vc_ctx_flags UNUSED * flags,
- struct vc_ctx_flags UNUSED * caps)
+parseCCaps(char const *str, struct vc_ctx_caps *caps)
{
- abort();
+ struct vc_err_listparser err;
+ int rc;
+
+ rc = vc_list2ccap(str,0, &err, caps);
+
+ if (rc==-1) {
+ WRITE_MSG(2, "Unknown ccap '");
+ write(2, err.ptr, err.len);
+ WRITE_MSG(2, "'\n");
+ exit(wrapper_exit_code);
+ }
}
+static void
+parseSecure(struct vc_ctx_flags UNUSED * flags,
+ struct vc_ctx_caps UNUSED * caps)
+{
+ caps->ccaps = ~0;
+ caps->cmask = ~0;
+ caps->bcaps = ~vc_get_securecaps();
+}
int main(int argc, char *argv[])
{
struct Arguments args = {
.xid = VC_NOCTX,
.flags = { .flagword = 0, .mask = 0 },
- .caps = { .flagword = 0, .mask = 0 },
+ .caps = { .bcaps = 0, .ccaps = 0, .cmask = 0 },
};
while (1) {
case CMD_VERSION : showVersion();
case CMD_SET : break; // default op currently
case CMD_XID : args.xid = atoi(optarg); break;
- case CMD_FLAG : setFlags(optarg, &args.flags); break;
- case CMD_CAP : setCaps(optarg, &args.caps); break;
- case CMD_SECURE : setSecure(&args.flags, &args.caps); break;
+ case CMD_FLAG : parseFlags(optarg, &args.flags); break;
+ case CMD_CCAP : parseCCaps(optarg, &args.caps); break;
+ case CMD_BCAP : parseBCaps(optarg, &args.caps); break;
+ case CMD_SECURE : parseSecure(&args.flags, &args.caps); break;
default :
WRITE_MSG(2, "Try '");
WRITE_STR(2, argv[0]);
if (args.xid==VC_NOCTX) args.xid = Evc_get_task_xid(0);
- if (vc_set_flags(args.xid,&args.flags)==-1)
- perror("vc_set_flags()");
-// else if (vc_set_caps(xid, &args.caps)==-1)
-// perror("vc_set_caps()");
+ if ((args.caps.cmask || args.caps.bcaps) &&
+ vc_set_ccaps(args.xid, &args.caps)==-1)
+ perror(ENSC_WRAPPERS_PREFIX "vc_set_ccaps()");
+ else if (args.flags.mask &&
+ vc_set_flags(args.xid, &args.flags)==-1)
+ perror(ENSC_WRAPPERS_PREFIX "vc_set_flags()");
+ else if (optind<argc)
+ EexecvpD(argv[optind], argv+optind);
else
return EXIT_SUCCESS;