* Inputs: argv[0] - list_id
* q - query name
* argv[2] - member ID (only for queries "amtl" and "dmfl")
- * cl - client name
+ * argv[7] - group IID (only for query "ulis")
+ * cl - client name
*
* - check that client is a member of the access control list
* - OR, if the query is add_member_to_list or delete_member_from_list
char *argv[];
client *cl;
##{
-## int list_id, acl_id, flags, rowcount;
+## int list_id, acl_id, flags, rowcount, gid;
## char acl_type[9];
char *client_type;
int client_id, status;
list_id = *(int *)argv[0];
## repeat retrieve (acl_id = list.#acl_id, acl_type = list.#acl_type,
-## flags = list.#public)
+## gid = list.#gid, flags = list.#public)
## where list.#list_id = @list_id
## inquire_equel(rowcount = "rowcount")
if (rowcount != 1)
if ((!strcmp("amtl", q->shortname) || !strcmp("dmfl", q->shortname)) &&
(flags && !strcmp("USER", argv[1]))) {
if (*(int *)argv[2] == client_id) return(SMS_SUCCESS);
+ /* if update_list, don't allow them to change the GID */
+ } else if (!strcmp("ulis", q->shortname)) {
+ if ((!strcmp(argv[7], UNIQUE_GID) && (gid != -1)) ||
+ (strcmp(argv[7], UNIQUE_GID) && (gid != atoi(argv[7]))))
+ return(SMS_PERM);
}
/* check for client in access control list */
return(access_visible_list(q, &argv[1], cl));
if (!strcmp(argv[0], "USER") || !strcmp(argv[0], "RUSER")) {
- if (!strcmp(cl->kname.name, argv[1]))
+ if (cl->users_id == *(int *)argv[1])
return(SMS_SUCCESS);
}
struct query *q;
char **argv;
##{
-## int id, flag;
+## int id, mid, flag;
## char type[9];
id = *(int *)argv[0];
-## repeat retrieve (type = u.potype, flag = any(machine.name
-## where machine.mach_id = u.pop_id
-## and u.pop_id != 0
-## and u.users_id = @id))
+## repeat retrieve (type = u.potype, mid = u.pop_id,
+## flag = any(machine.name where machine.mach_id = u.pop_id
+## and u.pop_id != 0 and u.users_id = @id))
## where u.users_id = @id
if (!flag)
return(SMS_MACHINE);
- if (strcmp(type, "POP"))
- set_pop_usage(id, 1);
+ if (strcmp(strtrim(type), "POP"))
+ set_pop_usage(mid, 1);
return(SMS_SUCCESS);
##}
## repeat retrieve (type = u.potype, id = u.pop_id)
## where u.users_id = @user
- if (strcmp(type, "POP"))
+ if (!strcmp(strtrim(type), "POP"))
set_pop_usage(id, -1);
return(SMS_SUCCESS);
##}
## repeat retrieve (flag = any(hostaccess.mach_id where hostaccess.mach_id=@id))
if (flag)
return(SMS_IN_USE);
-## repeat retrieve (flag = any(pcap.mach_id where pcap.mach_id=@id))
+## repeat retrieve (flag = any(printcap.mach_id where printcap.mach_id=@id))
if (flag)
return(SMS_IN_USE);
}
+/* Verify the arguments, depending on the FStype. Also, if this is an
+ * NFS filesystem, then update any quotas for that filesystem to reflect
+ * the new phys_id.
+ */
+
setup_ufil(q, argv)
struct query *q;
char *argv[];
-{
- char *type;
- int mach_id;
- char *name;
- char *access;
+##{
+ int mach_id, status;
+ char *type, *name, *access;
+## int fid;
type = argv[2];
mach_id = *(int *)argv[3];
access = argv[6];
var_phys_id = 0;
- if (!strcmp(type, "NFS"))
- return (check_nfs(mach_id, name, access));
- else
- return(SMS_SUCCESS);
-}
+ if (!strcmp(type, "NFS")) {
+ status = check_nfs(mach_id, name, access);
+ fid = *(int *)argv[0];
+## replace nfsquota (phys_id = var_phys_id) where nfsquota.filsys_id = fid
+ return(status);
+ } else
+ return(SMS_SUCCESS);
+##}
/* Find the NFS physical partition that the named directory is on.
## repeat retrieve (id = users.pop_id, potype = users.#potype)
## where users.users_id = @user
- if (!strcmp(potype, "POP"))
+ if (!strcmp(strtrim(potype), "POP"))
set_pop_usage(id, -1);
if (!strcmp(argv[1], "POP")) {
if (rowcount != 1)
return(SMS_NO_QUOTA);
## repeat append nfsquota (#users_id = @users_id, filsys_id = values.value,
-## #quota = @quota, modtime = "now", modby = @who,
-## modwith = @entity)
+## #quota = @quota, phys_id = @pid, modtime = "now",
+## modby = @who, modwith = @entity)
## where values.name = "filsys_id"
## inquire_equel(rowcount = "rowcount");
if (rowcount != 1)