lkml.org 
[lkml]   [2013]   [Oct]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V5 7/9] perf tools: add copyfile_mode()
    Date
    Add a function to copy a file specifying the
    permissions to use for the created file.

    Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
    ---
    tools/perf/util/util.c | 18 +++++++++++++-----
    tools/perf/util/util.h | 1 +
    2 files changed, 14 insertions(+), 5 deletions(-)

    diff --git a/tools/perf/util/util.c b/tools/perf/util/util.c
    index 141317e..2d6c42c 100644
    --- a/tools/perf/util/util.c
    +++ b/tools/perf/util/util.c
    @@ -55,17 +55,20 @@ int mkdir_p(char *path, mode_t mode)
    return (stat(path, &st) && mkdir(path, mode)) ? -1 : 0;
    }

    -static int slow_copyfile(const char *from, const char *to)
    +static int slow_copyfile(const char *from, const char *to, mode_t mode)
    {
    - int err = 0;
    + int err = -1;
    char *line = NULL;
    size_t n;
    FILE *from_fp = fopen(from, "r"), *to_fp;
    + mode_t old_umask;

    if (from_fp == NULL)
    goto out;

    + old_umask = umask(mode ^ 0777);
    to_fp = fopen(to, "w");
    + umask(old_umask);
    if (to_fp == NULL)
    goto out_fclose_from;

    @@ -82,7 +85,7 @@ out:
    return err;
    }

    -int copyfile(const char *from, const char *to)
    +int copyfile_mode(const char *from, const char *to, mode_t mode)
    {
    int fromfd, tofd;
    struct stat st;
    @@ -93,13 +96,13 @@ int copyfile(const char *from, const char *to)
    goto out;

    if (st.st_size == 0) /* /proc? do it slowly... */
    - return slow_copyfile(from, to);
    + return slow_copyfile(from, to, mode);

    fromfd = open(from, O_RDONLY);
    if (fromfd < 0)
    goto out;

    - tofd = creat(to, 0755);
    + tofd = creat(to, mode);
    if (tofd < 0)
    goto out_close_from;

    @@ -121,6 +124,11 @@ out:
    return err;
    }

    +int copyfile(const char *from, const char *to)
    +{
    + return copyfile_mode(from, to, 0755);
    +}
    +
    unsigned long convert_unit(unsigned long value, char *unit)
    {
    *unit = ' ';
    diff --git a/tools/perf/util/util.h b/tools/perf/util/util.h
    index 1f06ba4..42dfba7 100644
    --- a/tools/perf/util/util.h
    +++ b/tools/perf/util/util.h
    @@ -243,6 +243,7 @@ static inline int sane_case(int x, int high)

    int mkdir_p(char *path, mode_t mode);
    int copyfile(const char *from, const char *to);
    +int copyfile_mode(const char *from, const char *to, mode_t mode);

    s64 perf_atoll(const char *str);
    char **argv_split(const char *str, int *argcp);
    --
    1.7.11.7


    \
     
     \ /
      Last update: 2013-10-08 11:41    [W:4.061 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site