int get_ace_internal(char *atypex, int aid,
int (*action)(int, char *[], void *), void *actarg);
-int gmol_internal(struct query *q, char *argv[], client *cl,
- int (*action)(int, char *[], void *), void *actarg,
- int flag);
int qualified_get(struct query *q, char *argv[],
int (*action)(int, char *[], void *), void *actarg,
char *start, char *range, char *field, char *flags[]);
int add_member_to_list(struct query *q, char **argv, client *cl)
{
EXEC SQL BEGIN DECLARE SECTION;
- int id, lid, mid, error, who, ref, rowcnt;
+ int id, lid, mid, tag, error, who, ref, rowcnt;
char *mtype, dtype[IMEMBERS_MEMBER_TYPE_SIZE], *entity;
EXEC SQL END DECLARE SECTION;
int ancestors[MAXLISTDEPTH], aref[MAXLISTDEPTH], acount, a;
lid = *(int *)argv[0];
mtype = argv[1];
mid = *(int *)argv[2];
+ tag = !strcmp(q->shortname, "atml") ? *(int *)argv[3] : 0;
if (acl_access_check(lid, cl))
return MR_PERM;
if (a == 0 && d == 0)
{
EXEC SQL UPDATE imembers
- SET ref_count = ref_count + :ref, direct = 1
+ SET ref_count = ref_count + :ref, direct = 1, tag = :tag
WHERE list_id = :lid AND member_id = :mid
AND member_type = :mtype;
}
if (a == 0 && d == 0)
{
EXEC SQL INSERT INTO imembers
- (list_id, member_id, direct, member_type, ref_count)
- VALUES (:lid, :mid, 1, :mtype, 1);
+ (list_id, member_type, member_id, tag, direct, ref_count)
+ VALUES (:lid, :mtype, :mid, :tag, 1, 1);
}
else
{
EXEC SQL INSERT INTO imembers
- (list_id, member_id, direct, member_type, ref_count)
- VALUES (:lid, :mid, 0, :mtype, 1);
+ (list_id, member_type, member_id, tag, direct, ref_count)
+ VALUES (:lid, :mtype, :mid, :tag, 0, 1);
}
iargv[0] = (char *)lid;
iargv[1] = mtype;
}
-/* get_members_of_list - this gets only direct members */
-
int get_members_of_list(struct query *q, char *argv[], client *cl,
int (*action)(int, char *[], void *), void *actarg)
-{
- return gmol_internal(q, argv, cl, action, actarg, 1);
-}
-
-/* get_end_members_of_list - this gets direct or indirect members */
-
-int get_end_members_of_list(struct query *q, char *argv[], client *cl,
- int (*action)(int, char *[], void *), void *actarg)
-{
- return gmol_internal(q, argv, cl, action, actarg, 0);
-}
-
-/** gmol_internal - optimized query for retrieval of list members
- ** used by both get_members_of_list and get_end_members_of_list
- **
- ** Inputs:
- ** argv[0] - list_id
- **
- ** Description:
- ** - retrieve USER members, then LIST members, then STRING members
- **/
-
-int gmol_internal(struct query *q, char *argv[], client *cl,
- int (*action)(int, char *[], void *), void *actarg, int flag)
{
EXEC SQL BEGIN DECLARE SECTION;
int list_id, direct;
- char member_name[MAX_FIELD_WIDTH];
+ char member_name[MAX_FIELD_WIDTH], tag[STRINGS_STRING_SIZE];
EXEC SQL END DECLARE SECTION;
- char *targv[2];
+ char *targv[3];
+ int targc;
- /* true/false flag indicates whether to display only direct members. */
- if (flag)
+ /* For gmol or gtml, only get direct members. For geml, get all. */
+ if (!strcmp(q->shortname, "geml"))
+ direct = -1;
+ else
direct = 0;
+
+ /* For gmol or geml, only return type and name. For gtml, return tag too. */
+ if (!strcmp(q->shortname, "gtml"))
+ targc = 3;
else
- direct = -1;
+ targc = 2;
list_id = *(int *)argv[0];
targv[1] = member_name;
+ targv[2] = tag;
+
targv[0] = "USER";
EXEC SQL DECLARE csr119 CURSOR FOR
- SELECT u.login FROM users u, imembers im
+ SELECT u.login, s.string FROM users u, imembers im, strings s
WHERE im.list_id = :list_id AND im.member_type = 'USER'
AND im.member_id = u.users_id AND im.direct > :direct
- ORDER BY 1;
+ AND s.string_id = im.tag ORDER BY 1;
if (dbms_errno)
return mr_errcode;
EXEC SQL OPEN csr119;
return mr_errcode;
while (1)
{
- EXEC SQL FETCH csr119 INTO :member_name;
+ EXEC SQL FETCH csr119 INTO :member_name, :tag;
if (sqlca.sqlcode)
break;
- (*action)(2, targv, actarg);
+ (*action)(targc, targv, actarg);
}
EXEC SQL CLOSE csr119;
if (dbms_errno)
targv[0] = "LIST";
EXEC SQL DECLARE csr120 CURSOR FOR
- SELECT l.name FROM list l, imembers im
+ SELECT l.name, s.string FROM list l, imembers im, strings s
WHERE im.list_id = :list_id AND im.member_type = 'LIST'
AND im.member_id = l.list_id AND im.direct > :direct
- ORDER BY 1;
+ AND s.string_id = im.tag ORDER BY 1;
if (dbms_errno)
return mr_errcode;
EXEC SQL OPEN csr120;
return mr_errcode;
while (1)
{
- EXEC SQL FETCH csr120 INTO :member_name;
+ EXEC SQL FETCH csr120 INTO :member_name, :tag;
if (sqlca.sqlcode)
break;
- (*action)(2, targv, actarg);
+ (*action)(targc, targv, actarg);
}
EXEC SQL CLOSE csr120;
if (dbms_errno)
targv[0] = "STRING";
EXEC SQL DECLARE csr121 CURSOR FOR
- SELECT str.string FROM strings str, imembers im
+ SELECT str.string, s.string FROM strings str, imembers im, strings s
WHERE im.list_id = :list_id AND im.member_type = 'STRING'
AND im.member_id = str.string_id AND im.direct > :direct
- ORDER BY 1;
+ AND s.string_id = im.tag ORDER BY 1;
if (dbms_errno)
return mr_errcode;
EXEC SQL OPEN csr121;
return mr_errcode;
while (1)
{
- EXEC SQL FETCH csr121 INTO :member_name;
+ EXEC SQL FETCH csr121 INTO :member_name, :tag;
if (sqlca.sqlcode)
break;
- (*action)(2, targv, actarg);
+ (*action)(targc, targv, actarg);
}
EXEC SQL CLOSE csr121;
if (dbms_errno)
targv[0] = "KERBEROS";
EXEC SQL DECLARE csr122 CURSOR FOR
- SELECT str.string FROM strings str, imembers im
+ SELECT str.string, s.string FROM strings str, imembers im, strings s
WHERE im.list_id = :list_id AND im.member_type = 'KERBEROS'
- AND im.member_id = str.string_id
- AND im.direct > :direct
- ORDER BY 1;
+ AND im.member_id = str.string_id AND im.direct > :direct
+ AND s.string_id = im.tag ORDER BY 1;
if (dbms_errno)
return mr_errcode;
EXEC SQL OPEN csr122;
return mr_errcode;
while (1)
{
- EXEC SQL FETCH csr122 INTO :member_name;
+ EXEC SQL FETCH csr122 INTO :member_name, :tag;
if (sqlca.sqlcode)
break;
- (*action)(2, targv, actarg);
+ (*action)(targc, targv, actarg);
}
EXEC SQL CLOSE csr122;
if (dbms_errno)
"list_name", "member_type", "member_name",
};
+static char *atml_fields[] = {
+ "list_name", "member_type", "member_name", "tag",
+};
+
static struct valobj amtl_valobj[] = {
{V_ID, 0, LIST_TABLE, "name", "list_id", MR_LIST},
{V_TYPE, 1, 0, "member", 0, MR_TYPE},
{V_TYPEDATA, 2, 0, 0, 0, MR_NO_MATCH},
+ {V_ID, 3, STRINGS_TABLE, "string", "string_id", MR_NO_MATCH},
};
static struct validate amtl_validate =
add_member_to_list,
};
+static struct validate atml_validate =
+{
+ amtl_valobj,
+ 4,
+ 0,
+ 0,
+ 0,
+ 0,
+ access_list,
+ 0,
+ add_member_to_list,
+};
+
+static struct validate tmol_validate =
+{
+ amtl_valobj,
+ 4,
+ "tag",
+ "list_id = %d AND member_type = '%s' AND member_id = %d",
+ 3,
+ 0,
+ access_list,
+ 0,
+ 0,
+};
+
static struct validate dmfl_validate =
{
amtl_valobj,
"member_type", "member_name",
};
-static struct validate gmol_validate = {
- VOlist0,
- 1,
- 0,
- 0,
- 0,
- 0,
- access_visible_list,
- 0,
- get_members_of_list,
+static char *gtml_fields[] = {
+ "list_name",
+ "member_type", "member_name", "tag",
};
-static struct validate geml_validate = {
+static struct validate gmol_validate = {
VOlist0,
1,
0,
0,
access_visible_list,
0,
- get_end_members_of_list,
+ get_members_of_list,
};
static char *glom_fields[] = {
static struct valobj azcl_valobj[] = {
{V_CHAR, 0, ZEPHYR_TABLE, "class"},
- {V_TYPE, 1, 0, "ace_type", 0, MR_ACE},
+ {V_TYPE, 1, 0, "zace_type", 0, MR_ACE},
{V_TYPEDATA, 2, 0, 0, "list_id", MR_ACE},
- {V_TYPE, 3, 0, "ace_type", 0, MR_ACE},
+ {V_TYPE, 3, 0, "zace_type", 0, MR_ACE},
{V_TYPEDATA, 4, 0, 0, "list_id", MR_ACE},
- {V_TYPE, 5, 0, "ace_type", 0, MR_ACE},
+ {V_TYPE, 5, 0, "zace_type", 0, MR_ACE},
{V_TYPEDATA, 6, 0, 0, "list_id", MR_ACE},
- {V_TYPE, 7, 0, "ace_type", 0, MR_ACE},
+ {V_TYPE, 7, 0, "zace_type", 0, MR_ACE},
{V_TYPEDATA, 8, 0, 0, "list_id", MR_ACE},
};
static struct valobj uzcl_valobj[] = {
{V_NAME, 0, ZEPHYR_TABLE, "class", 0, MR_BAD_CLASS},
{V_RENAME, 1, ZEPHYR_TABLE, "class", 0, MR_NOT_UNIQUE},
- {V_TYPE, 2, 0, "ace_type", 0, MR_ACE},
+ {V_TYPE, 2, 0, "zace_type", 0, MR_ACE},
{V_TYPEDATA, 3, 0, 0, "list_id", MR_ACE},
- {V_TYPE, 4, 0, "ace_type", 0, MR_ACE},
+ {V_TYPE, 4, 0, "zace_type", 0, MR_ACE},
{V_TYPEDATA, 5, 0, 0, "list_id", MR_ACE},
- {V_TYPE, 6, 0, "ace_type", 0, MR_ACE},
+ {V_TYPE, 6, 0, "zace_type", 0, MR_ACE},
{V_TYPEDATA, 7, 0, 0, "list_id", MR_ACE},
- {V_TYPE, 8, 0, "ace_type", 0, MR_ACE},
+ {V_TYPE, 8, 0, "zace_type", 0, MR_ACE},
{V_TYPEDATA, 9, 0, 0, "list_id", MR_ACE},
};
set_modtime_by_id,
};
+static char *gacl_fields[] = {
+ "machine", "target",
+ "machine", "target", "kind", "list",
+};
+
+static char *aacl_fields[] = {
+ "machine", "target", "kind", "list",
+};
+
+static char *dacl_fields[] = {
+ "machine", "target",
+};
+
+static struct valobj aacl_valobj[] = {
+ {V_ID, 0, MACHINE_TABLE, "name", "mach_id", MR_MACHINE},
+ {V_CHAR, 1, ACL_TABLE, "target"},
+ {V_TYPE, 2, 0, "acl_kind", 0, MR_TYPE},
+ {V_ID, 3, LIST_TABLE, "name", "list_id", MR_LIST},
+};
+
+static struct validate gacl_validate =
+{
+ aacl_valobj,
+ 1,
+ NULL,
+ NULL,
+ 0,
+ "mach_id",
+ /* access_acl */ 0,
+ 0,
+ 0,
+};
+
+static struct validate aacl_validate =
+{
+ aacl_valobj,
+ 4,
+ "mach_id",
+ "mach_id = %d AND target = '%s'",
+ 2,
+ "mach_id",
+ /* access_acl */ 0,
+ 0,
+ 0,
+};
+
static char *gsvc_fields[] = {
"service",
"service", "protocol", "port", "description", "modtime", "modby", "modwith",
&amtl_validate,
},
+ {
+ /* Q_ATML - ADD_TAGGED_MEMBER_TO_LIST */
+ "add_tagged_member_to_list",
+ "atml",
+ APPEND,
+ 0,
+ IMEMBERS_TABLE,
+ 0,
+ atml_fields,
+ 4,
+ NULL,
+ 0,
+ NULL,
+ &atml_validate,
+ },
+
+ {
+ /* Q_TMOL - TAG_MEMBER_OF_LIST */
+ "tag_member_of_list",
+ "tmol",
+ UPDATE,
+ "im",
+ IMEMBERS_TABLE,
+ "imembers SET tag = %d",
+ atml_fields,
+ 1,
+ "list_id = %d AND member_type = '%s' and member_id = %d",
+ 3,
+ NULL,
+ &tmol_validate,
+ },
+
{
/* Q_DMFL - DELETE_MEMBER_FROM_LIST */
"delete_member_from_list",
NULL,
1,
NULL,
- &geml_validate,
+ &gmol_validate,
+ },
+
+ {
+ /* Q_GTML - GET_TAGGED_MEMBERS_OF_LIST */
+ "get_tagged_members_of_list",
+ "gtml",
+ RETRIEVE,
+ NULL,
+ IMEMBERS_TABLE,
+ NULL,
+ gtml_fields,
+ 3,
+ NULL,
+ 1,
+ NULL,
+ &gmol_validate,
},
{
&VDmach,
},
+ {
+ /* Q_GACL - GET_ACL */
+ "get_acl",
+ "gacl",
+ RETRIEVE,
+ "ac",
+ ACL_TABLE,
+ "m.name, ac.target, ac.kind, l.name FROM acl ac, machine m, list l",
+ gacl_fields,
+ 4,
+ "m.mach_id = %d AND m.mach_id = ac.mach_id AND ac.target LIKE '%s' AND l.list_id = ac.list_id",
+ 2,
+ "m.name, ac.target, ac.kind",
+ &gacl_validate,
+ },
+
+ {
+ /* Q_AACL - ADD_ACL */
+ "add_acl",
+ "aacl",
+ APPEND,
+ "ac",
+ ACL_TABLE,
+ "INTO acl (mach_id, target, kind, list_id) VALUES (%d, '%s', '%s', %d)",
+ aacl_fields,
+ 4,
+ 0,
+ 0,
+ NULL,
+ &aacl_validate,
+ },
+
+ {
+ /* Q_DACL - DELETE_ACL */
+ "delete_acl",
+ "dacl",
+ DELETE,
+ "ac",
+ ACL_TABLE,
+ 0,
+ dacl_fields,
+ 0,
+ "mach_id = %d AND target = '%s'",
+ 2,
+ NULL,
+ &gacl_validate,
+ },
+
{
/* Q_GSVC - GET_SERVICE */
"get_service",