[libvirt] [PATCH] Add virFileWriteStr()

Daniel P. Berrange berrange at redhat.com
Fri Feb 13 16:22:36 UTC 2009


On Fri, Feb 13, 2009 at 12:06:12PM +0000, Mark McLoughlin wrote:
> Re-factor the code from networkEnableIpForwarding() into a
> utility function in preparation for code which writes to
> sysfs files.
> 
> Signed-off-by: Mark McLoughlin <markmc at redhat.com>
> ---
>  src/libvirt_private.syms |    1 +
>  src/network_driver.c     |   26 ++------------------------
>  src/util.c               |   24 ++++++++++++++++++++++++
>  src/util.h               |    2 ++
>  4 files changed, 29 insertions(+), 24 deletions(-)
> 
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 4338da7..9e9b3e5 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -279,6 +279,7 @@ virCondBroadcast;
>  
>  # util.h
>  virFileReadAll;
> +virFileWriteStr;
>  virStrToLong_i;
>  virStrToLong_ll;
>  virStrToLong_ull;
> diff --git a/src/network_driver.c b/src/network_driver.c
> index 4138939..b256e3d 100644
> --- a/src/network_driver.c
> +++ b/src/network_driver.c
> @@ -794,33 +794,11 @@ networkRemoveIptablesRules(struct network_driver *driver,
>      iptablesSaveRules(driver->iptables);
>  }
>  
> -/* Enable IP Forwarding.
> -   Return 0 for success, nonzero for failure.
> -   Be careful to preserve any errno value upon failure. */
> +/* Enable IP Forwarding. Return 0 for success, nonzero for failure. */
>  static int
>  networkEnableIpForwarding(void)
>  {
> -#define PROC_IP_FORWARD "/proc/sys/net/ipv4/ip_forward"
> -
> -    int fd;
> -
> -    if ((fd = open(PROC_IP_FORWARD, O_WRONLY|O_TRUNC)) == -1)
> -        return 0;
> -
> -    if (safewrite(fd, "1\n", 2) < 0) {
> -        int saved_errno = errno;
> -        close (fd);
> -        errno = saved_errno;
> -        return 0;
> -    }
> -
> -    /* Use errno from failed close only if there was no write error.  */
> -    if (close (fd) != 0)
> -        return 0;
> -
> -    return 1;
> -
> -#undef PROC_IP_FORWARD
> +    return virFileWriteStr("/proc/sys/net/ipv4/ip_forward", "1\n");
>  }
>  
>  static int networkStartNetworkDaemon(virConnectPtr conn,
> diff --git a/src/util.c b/src/util.c
> index 01fe37a..990433a 100644
> --- a/src/util.c
> +++ b/src/util.c
> @@ -774,6 +774,30 @@ int virFileReadAll(const char *path, int maxlen, char **buf)
>      return len;
>  }
>  
> +/* Truncate @path and write @str to it.
> +   Return 0 for success, nonzero for failure.
> +   Be careful to preserve any errno value upon failure. */
> +int virFileWriteStr(const char *path, const char *str)
> +{
> +    int fd;
> +
> +    if ((fd = open(path, O_WRONLY|O_TRUNC)) == -1)
> +        return -1;
> +
> +    if (safewrite(fd, str, strlen(str)) < 0) {
> +        int saved_errno = errno;
> +        close (fd);
> +        errno = saved_errno;
> +        return -1;
> +    }
> +
> +    /* Use errno from failed close only if there was no write error.  */
> +    if (close (fd) != 0)
> +        return -1;
> +
> +    return 0;
> +}
> +
>  int virFileMatchesNameSuffix(const char *file,
>                               const char *name,
>                               const char *suffix)
> diff --git a/src/util.h b/src/util.h
> index 4667b92..a79cfa7 100644
> --- a/src/util.h
> +++ b/src/util.h
> @@ -56,6 +56,8 @@ int virFileReadLimFD(int fd, int maxlen, char **buf);
>  
>  int virFileReadAll(const char *path, int maxlen, char **buf);
>  
> +int virFileWriteStr(const char *path, const char *str);
> +
>  int virFileMatchesNameSuffix(const char *file,
>                               const char *name,
>                               const char *suffix);
> -- 

ACK. You might like to make virCgroupSetValueStr() use this new method
too, since it has more or less this same exact code.

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list