Print this page
12288 getfacl and setfacl could stand improvement
@@ -18,10 +18,11 @@
*
* CDDL HEADER END
*/
/*
* Copyright (c) 1993, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright 2020 Peter Tribble.
*/
/*
* setfacl [-r] -f aclfile file ...
* setfacl [-r] -d acl_entries file ...
@@ -39,10 +40,11 @@
#include <locale.h>
#include <sys/acl.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
+#include <ctype.h>
#define ADD 1
#define MODIFY 2
#define DELETE 3
#define SET 4
@@ -68,11 +70,11 @@
int sflag = 0;
int fflag = 0;
int errflag = 0;
int aclcnt; /* used by -m -d */
aclent_t *aclp; /* used by -m -d */
- char *aclfilep; /* acl file argument */
+ char *aclfilep = NULL; /* acl file argument */
char *d_entryp = NULL; /* ptr to del entry list */
char *m_entryp = NULL; /* ptr to mod entry list */
char *s_entryp = NULL; /* ptr to set entry list */
char *work_dp = NULL; /* working ptrs for the above */
char *work_mp = NULL;
@@ -197,11 +199,11 @@
if (errno == ENOSYS) {
(void) fprintf(stderr,
gettext("File system doesn't support aclent_t "
"style ACL's.\n"
"See acl(5) for more information on"
- " ACL styles support by Solaris.\n"));
+ "POSIX-draft ACL support.\n"));
return (-1);
}
(void) fprintf(stderr,
gettext("%s: failed to get acl count\n"), filep);
perror("get acl count error");
@@ -237,12 +239,10 @@
*/
static int
mod_entries(aclent_t *aclp, int cnt, char *modp, char *delp,
char *fnamep, int rfg)
{
- int rc; /* return code */
-
/* modify and add: from -m option */
if (parse_entry_list(&aclp, &cnt, modp, MODIFY) == -1)
return (-1);
/* deletion: from -d option */
@@ -340,11 +340,10 @@
* Finally it sets ACL to the file (fnamep).
*/
static int
set_online_entries(char *setp, char *fnamep, int rflag)
{
- char *commap;
aclent_t *aclp;
int aclcnt = 0;
if (parse_entry_list(&aclp, &aclcnt, setp, SET) == -1)
return (-1);
@@ -412,21 +411,10 @@
int is_obj;
if (entryp == NULL)
return (0);
- if (*cntp > 1)
- new_aclp = (aclent_t *)realloc(*aclpp,
- sizeof (aclent_t) * (*cntp));
- else
- new_aclp = (aclent_t *) malloc(sizeof (aclent_t) * (*cntp));
- if (new_aclp == NULL) {
- fprintf(stderr,
- gettext("Insufficient memory for acl %d\n"), *cntp);
- return (-1);
- }
-
tmpacl.a_id = 0; /* id field needs to be initialized */
if (entryp[0] == 'u')
tmpacl.a_id = getuid(); /* id field for user */
if (entryp[0] == 'g')
tmpacl.a_id = getgid(); /* id field for group */
@@ -440,10 +428,21 @@
(tmpacl.a_type == CLASS_OBJ) ||
(tmpacl.a_type == DEF_USER_OBJ) ||
(tmpacl.a_type == DEF_GROUP_OBJ) ||
(tmpacl.a_type == DEF_OTHER_OBJ));
+ if (*cntp > 1)
+ new_aclp = (aclent_t *)realloc(*aclpp,
+ sizeof (aclent_t) * (*cntp));
+ else
+ new_aclp = (aclent_t *) malloc(sizeof (aclent_t) * (*cntp));
+ if (new_aclp == NULL) {
+ fprintf(stderr,
+ gettext("Insufficient memory for acl %d\n"), *cntp);
+ return (-1);
+ }
+
cur_cnt = *cntp - 1;
switch (mode) {
case MODIFY: /* and add */
for (taclp = new_aclp; cur_cnt-- > 0; taclp++) {
if (taclp->a_type == tmpacl.a_type &&