aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/acl.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/acl.c')
-rw-r--r--src/backend/utils/adt/acl.c93
1 files changed, 26 insertions, 67 deletions
diff --git a/src/backend/utils/adt/acl.c b/src/backend/utils/adt/acl.c
index 1da525bd032..eeb95430271 100644
--- a/src/backend/utils/adt/acl.c
+++ b/src/backend/utils/adt/acl.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/acl.c,v 1.60 2001/06/05 19:34:56 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/acl.c,v 1.61 2001/06/09 23:21:55 petere Exp $
*
*-------------------------------------------------------------------------
*/
@@ -27,15 +27,13 @@
#include "utils/memutils.h"
#include "utils/syscache.h"
-static char *getid(char *s, char *n);
-static bool aclitemeq(AclItem *a1, AclItem *a2);
-static bool aclitemgt(AclItem *a1, AclItem *a2);
-static char *aclparse(char *s, AclItem *aip, unsigned *modechg);
+static const char *getid(const char *s, char *n);
+static bool aclitemeq(const AclItem *a1, const AclItem *a2);
+static bool aclitemgt(const AclItem *a1, const AclItem *a2);
#define ACL_IDTYPE_GID_KEYWORD "group"
#define ACL_IDTYPE_UID_KEYWORD "user"
-
/*
* getid
* Consumes the first alphanumeric string (identifier) found in string
@@ -48,11 +46,11 @@ static char *aclparse(char *s, AclItem *aip, unsigned *modechg);
* - loads the identifier into 'name'. (If no identifier is found, 'name'
* contains an empty string.) name must be NAMEDATALEN bytes.
*/
-static char *
-getid(char *s, char *n)
+static const char *
+getid(const char *s, char *n)
{
unsigned len;
- char *id;
+ const char *id;
int in_quotes = 0;
Assert(s && n);
@@ -105,8 +103,8 @@ getid(char *s, char *n)
* UID/GID, id type identifier and mode type values.
* - loads 'modechg' with the mode change flag.
*/
-static char *
-aclparse(char *s, AclItem *aip, unsigned *modechg)
+const char *
+aclparse(const char *s, AclItem *aip, unsigned *modechg)
{
HeapTuple htup;
char name[NAMEDATALEN];
@@ -245,7 +243,7 @@ makeacl(int n)
Datum
aclitemin(PG_FUNCTION_ARGS)
{
- char *s = PG_GETARG_CSTRING(0);
+ const char *s = PG_GETARG_CSTRING(0);
AclItem *aip;
unsigned modechg;
@@ -351,13 +349,13 @@ aclitemout(PG_FUNCTION_ARGS)
* a boolean value indicating = or >
*/
static bool
-aclitemeq(AclItem *a1, AclItem *a2)
+aclitemeq(const AclItem *a1, const AclItem *a2)
{
return a1->ai_idtype == a2->ai_idtype && a1->ai_id == a2->ai_id;
}
static bool
-aclitemgt(AclItem *a1, AclItem *a2)
+aclitemgt(const AclItem *a1, const AclItem *a2)
{
return ((a1->ai_idtype > a2->ai_idtype) ||
(a1->ai_idtype == a2->ai_idtype && a1->ai_id > a2->ai_id));
@@ -371,7 +369,7 @@ aclitemgt(AclItem *a1, AclItem *a2)
* newly-created tables (or any table with a NULL acl entry in pg_class)
*/
Acl *
-acldefault(char *relname, AclId ownerid)
+acldefault(const char *relname, AclId ownerid)
{
Acl *acl;
AclItem *aip;
@@ -398,7 +396,7 @@ acldefault(char *relname, AclId ownerid)
* NB: caller is responsible for having detoasted the input ACL, if needed.
*/
Acl *
-aclinsert3(Acl *old_acl, AclItem *mod_aip, unsigned modechg)
+aclinsert3(const Acl *old_acl, const AclItem *mod_aip, unsigned modechg)
{
Acl *new_acl;
AclItem *old_aip,
@@ -595,41 +593,6 @@ aclcontains(PG_FUNCTION_ARGS)
PG_RETURN_BOOL(false);
}
-/*
- * ExecuteChangeACLStmt
- * Called to execute the utility command type ChangeACLStmt
- */
-void
-ExecuteChangeACLStmt(ChangeACLStmt *stmt)
-{
- AclItem aclitem;
- unsigned modechg;
- List *i;
-
- /* see comment in pg_type.h */
- Assert(ACLITEMSIZE == sizeof(AclItem));
-
- /* Convert string ACL spec into internal form */
- aclparse(stmt->aclString, &aclitem, &modechg);
-
- foreach(i, stmt->relNames)
- {
- char *relname = strVal(lfirst(i));
- Relation rel;
-
- rel = heap_openr(relname, AccessExclusiveLock);
- if (rel && rel->rd_rel->relkind == RELKIND_INDEX)
- elog(ERROR, "\"%s\" is an index relation",
- relname);
- if (!pg_ownercheck(GetUserId(), relname, RELNAME))
- elog(ERROR, "you do not own class \"%s\"",
- relname);
- ChangeAcl(relname, &aclitem, modechg);
- /* close rel, but keep lock until end of xact */
- heap_close(rel, NoLock);
- }
-}
-
/*
* Parser support routines for ACL-related statements.
@@ -648,7 +611,7 @@ ExecuteChangeACLStmt(ChangeACLStmt *stmt)
* does not add duplicate privileges
*/
char *
-aclmakepriv(char *old_privlist, char new_priv)
+aclmakepriv(const char *old_privlist, char new_priv)
{
char *priv;
int i;
@@ -698,7 +661,7 @@ aclmakepriv(char *old_privlist, char new_priv)
* Per above comments, we can't try to resolve a user or group name here.
*/
char *
-aclmakeuser(char *user_type, char *user)
+aclmakeuser(const char *user_type, const char *user)
{
char *user_list;
@@ -707,22 +670,20 @@ aclmakeuser(char *user_type, char *user)
return user_list;
}
+
/*
- * makeAclStmt:
- * create a ChangeACLStmt at parse time.
- * we take in the privileges, relation_name_list, and grantee
- * as well as a single character '+' or '-' to indicate grant or revoke
+ * makeAclString: We take in the privileges and grantee as well as a
+ * single character '+' or '-' to indicate grant or revoke.
*
* We convert the information to the same external form recognized by
- * aclitemin (see aclparse), and save that string in the ChangeACLStmt.
- * Conversion to internal form happens when the statement is executed.
+ * aclitemin (see aclparse) and return that string. Conversion to
+ * internal form happens when the statement is executed.
*/
-ChangeACLStmt *
-makeAclStmt(char *privileges, List *rel_list, char *grantee,
- char grant_or_revoke)
+char *
+makeAclString(const char *privileges, const char *grantee, char grant_or_revoke)
{
- ChangeACLStmt *n = makeNode(ChangeACLStmt);
StringInfoData str;
+ char *ret;
initStringInfo(&str);
@@ -745,9 +706,7 @@ makeAclStmt(char *privileges, List *rel_list, char *grantee,
appendStringInfo(&str, "%c%s",
grant_or_revoke, privileges);
}
- n->relNames = rel_list;
- n->aclString = pstrdup(str.data);
-
+ ret = pstrdup(str.data);
pfree(str.data);
- return n;
+ return ret;
}