On 11/02/2010 02:29 PM, Ivana Hutarova Varekova wrote:
> From: Your Name<[email protected]>
>
> This patch adds permission change function
> int cg_chmod_recursive(struct cgroup *cgroup, mode_t dir_mode,
>         int dirm_change, mode_t file_mode, int filem_change);
>
> It changes the directory and files permissions to values.

Which values? Just random? :)

> If dirm_change is nonzero, then directory permissions will be set to the 
> second parameter
> dir_mode.
> If filem_change is nonzero, then directory permissions will be set to the 
> second parameter
> file_mode.
>
> Signed-off-by: Ivana Hutarova Varekova<[email protected]>
> ---
>
>   include/libcgroup/groups.h |   11 +++++++
>   src/api.c                  |   70 
> ++++++++++++++++++++++++++++++++++++++++++++
>   src/libcgroup.map          |    1 +
>   3 files changed, 82 insertions(+), 0 deletions(-)
>
> diff --git a/include/libcgroup/groups.h b/include/libcgroup/groups.h
> index d212ec0..5bfa485 100644
> --- a/include/libcgroup/groups.h
> +++ b/include/libcgroup/groups.h
> @@ -519,6 +519,17 @@ char *cgroup_get_value_name(struct cgroup_controller 
> *controller, int index);
>   int cgroup_get_procs(char *name, char *controller, pid_t **pids, int *size);
>
>   /**
> + * Change permission of files and directories of given group group

2x 'group'

> + * @param cgroup The cgroup which permissions should be changed
> + * @param dir_mode The permission mode of group directory
> + * @param dirm_change Denotes whether the directory change should be done
> + * @param file_mode The permission mode of group files
> + * @param filem_change Denotes whether the directory change should be done
> + */
> +int cg_chmod_recursive(struct cgroup *cgroup, mode_t dir_mode,
> +     int dirm_change, mode_t file_mode, int filem_change);
> +
> +/**
>    * @}
>    * @}
>    */
> diff --git a/src/api.c b/src/api.c
> index 6e79db0..4ccab74 100644
> --- a/src/api.c
> +++ b/src/api.c
> @@ -171,6 +171,76 @@ static int cg_chown_recursive(char **path, uid_t owner, 
> gid_t group)
>       return ret;
>   }
>
> +int cg_chmod_file(FTS *fts, FTSENT *ent, mode_t dir_mode,
> +     int dirm_change, mode_t file_mode, int filem_change)
> +{
> +     int ret = 0;
> +     const char *filename = fts->fts_path;
> +     cgroup_dbg("chmod: seeing file %s\n", filename);
> +     switch (ent->fts_info) {
> +     case FTS_ERR:
> +             errno = ent->fts_errno;
> +             break;
> +     case FTS_D:
> +     case FTS_DC:
> +     case FTS_DNR:
> +     case FTS_DP:
> +             if (dirm_change)
> +                     ret = chmod(filename, dir_mode);
> +             break;
> +     case FTS_F:
> +     case FTS_NSOK:
> +     case FTS_NS:
> +     case FTS_DEFAULT:
> +             if (filem_change)
> +                     ret = chmod(filename, file_mode);
> +             break;
> +     }

if (ret < 0) {
        last_errno = errno;
        ret = ECGOTHER;
}

> +     return ret;
> +}
> +
> +
> +/*
> + * TODO: Need to decide a better place to put this function.
> + */
> +int cg_chmod_recursive(struct cgroup *cgroup, mode_t dir_mode,
> +       int dirm_change, mode_t file_mode, int filem_change)
> +{
> +     int ret = 0;
> +     FTS *fts;
> +     char *fts_path[2];
> +     char *path = NULL;
> +
> +     cgroup_dbg("chmod: path is %s\n", *path);

api.c: In function ‘cg_chmod_recursive’:
api.c:214: warning: format ‘%s’ expects type ‘char *’, but argument 2 
has type ‘int’

+ Segmentation fault (core dumped)


> +     fts_path[0] = (char *)malloc(FILENAME_MAX);

Is this memory ever released?

> +     if (!fts_path[0]) {
> +             last_errno = errno;
> +             return ECGOTHER;
> +     }
> +     fts_path[1] = NULL;
> +     path = fts_path[0];
> +
> +     if (!cg_build_path(cgroup->name, path,
> +                     cgroup->controller[0]->name))
> +             return -1;

It should return correct ECG* error code.

> +
> +     fts = fts_open(fts_path, FTS_PHYSICAL | FTS_NOCHDIR |
> +                     FTS_NOSTAT, NULL);

Missing check for errors?

> +     while (1) {
> +             FTSENT *ent;
> +             ent = fts_read(fts);
> +             if (!ent) {
> +                     cgroup_dbg("fts_read failed\n");
> +                     break;
> +             }
> +             ret = cg_chmod_file(fts, ent, dir_mode, dirm_change,
> +                     file_mode, filem_change);
> +     }
> +     fts_close(fts);
> +     return ret;
> +}
> +
> +
>   static char *cgroup_basename(const char *path)
>   {
>       char *base;
> diff --git a/src/libcgroup.map b/src/libcgroup.map
> index 60970ca..2a3439f 100644
> --- a/src/libcgroup.map
> +++ b/src/libcgroup.map
> @@ -94,4 +94,5 @@ CGROUP_0.37 {
>       cgroup_read_value_begin;
>       cgroup_read_value_next;
>       cgroup_read_value_end;
> +     cg_chmod_recursive;
>   } CGROUP_0.36;
>

------------------------------------------------------------------------------
Achieve Improved Network Security with IP and DNS Reputation.
Defend against bad network traffic, including botnets, malware, 
phishing sites, and compromised hosts - saving your company time, 
money, and embarrassment.   Learn More! 
http://p.sf.net/sfu/hpdev2dev-nov
_______________________________________________
Libcg-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/libcg-devel

Reply via email to