From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pigeon.gentoo.org ([208.92.234.80] helo=lists.gentoo.org) by finch.gentoo.org with esmtp (Exim 4.60) (envelope-from ) id 1Rtvs1-0003Nd-4O for garchives@archives.gentoo.org; Sun, 05 Feb 2012 06:46:41 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 6F6C1E071D; Sun, 5 Feb 2012 06:46:33 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 281B8E071D for ; Sun, 5 Feb 2012 06:46:32 +0000 (UTC) Received: from pelican.gentoo.org (unknown [66.219.59.40]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 7EC701B4006 for ; Sun, 5 Feb 2012 06:46:32 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by pelican.gentoo.org (Postfix) with ESMTP id C157F80043 for ; Sun, 5 Feb 2012 06:46:31 +0000 (UTC) From: "Alexandre Restovtsev" To: gentoo-commits@lists.gentoo.org Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Alexandre Restovtsev" Message-ID: <66ab55afd15550e937972bf980336d1c51246165.tetromino@gentoo> Subject: [gentoo-commits] proj/openrc-settingsd:master commit in: src/, / X-VCS-Repository: proj/openrc-settingsd X-VCS-Files: TODO src/hostnamed.c src/shell-utils.c src/shell-utils.h X-VCS-Directories: src/ / X-VCS-Committer: tetromino X-VCS-Committer-Name: Alexandre Restovtsev X-VCS-Revision: 66ab55afd15550e937972bf980336d1c51246165 Date: Sun, 5 Feb 2012 06:46:31 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: quoted-printable X-Archives-Salt: 65725ff3-a200-4420-b8bc-9b5dd42d70c2 X-Archives-Hash: 4709533a330c7cd09b8eeb979f7e0eab commit: 66ab55afd15550e937972bf980336d1c51246165 Author: Alexandre Rostovtsev gentoo org> AuthorDate: Sun Feb 5 06:43:59 2012 +0000 Commit: Alexandre Restovtsev gmail com> CommitDate: Sun Feb 5 06:43:59 2012 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/openrc-settin= gsd.git;a=3Dcommit;h=3D66ab55af Port to GFile, and add shell_utils_trivial_set_and_save() to simplify on_= handle_set_* callbacks --- TODO | 4 - src/hostnamed.c | 57 ++++----------- src/shell-utils.c | 201 +++++++++++++++++++++++++++++++----------------= ------ src/shell-utils.h | 13 +++- 4 files changed, 145 insertions(+), 130 deletions(-) diff --git a/TODO b/TODO index 530ec81..62ec523 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,3 @@ -Use GFile for file I/O to take advantage of built-in temporary handling. - -Refactor on_handle_set_* callbacks (lots of code duplication currently). - Source /etc/rc.conf after /etc/conf.d/$service; do something intelligent if the relevant variable is set in /etc/rc.conf (go to read-only mode?) =20 diff --git a/src/hostnamed.c b/src/hostnamed.c index d910fb0..c21d875 100644 --- a/src/hostnamed.c +++ b/src/hostnamed.c @@ -20,7 +20,6 @@ #include #include #include -#include =20 #include #include @@ -45,9 +44,11 @@ static OpenrcSettingsdHostnamedHostname1 *hostname1 =3D= NULL; static gchar hostname[HOST_NAME_MAX + 1]; G_LOCK_DEFINE_STATIC (hostname); static gchar *static_hostname =3D NULL; +static GFile *static_hostname_file =3D NULL; G_LOCK_DEFINE_STATIC (static_hostname); static gchar *pretty_hostname =3D NULL; static gchar *icon_name =3D NULL; +static GFile *machine_info_file =3D NULL; G_LOCK_DEFINE_STATIC (machine_info); =20 static gboolean @@ -174,25 +175,7 @@ on_handle_set_static_hostname (OpenrcSettingsdHostna= medHostname1 *hostname1, if (!hostname_is_valid (name)) name =3D "localhost"; =20 - confd_file =3D shell_utils_trivial_new (SYSCONFDIR "/conf.d/hostname= ", &err); - if (confd_file =3D=3D NULL) { - g_dbus_method_invocation_return_gerror (invocation, err); - G_UNLOCK (static_hostname); - goto end; - } - - if (!shell_utils_trivial_set_variable (confd_file, "hostname", name,= FALSE) && - !shell_utils_trivial_set_variable (confd_file, "HOSTNAME", name,= FALSE) && - !shell_utils_trivial_set_variable (confd_file, "hostname", name,= TRUE)) - { - g_dbus_method_invocation_return_dbus_error (invocation, - DBUS_ERROR_FAILED, - "Failed to set stati= c hostname in " SYSCONFDIR "/conf.d/hostname"); - G_UNLOCK (static_hostname); - goto end; - } - - if (!shell_utils_trivial_save (confd_file, &err)) { + if (!shell_utils_trivial_set_and_save (static_hostname_file, &err, "= hostname", "HOSTNAME", name, NULL)) { g_dbus_method_invocation_return_gerror (invocation, err); G_UNLOCK (static_hostname); goto end; @@ -240,24 +223,10 @@ on_handle_set_machine_info (OpenrcSettingsdHostname= dHostname1 *hostname1, if (name =3D=3D NULL) name =3D ""; =20 - confd_file =3D shell_utils_trivial_new (SYSCONFDIR "/machine-info", = &err); - if (confd_file =3D=3D NULL) { - g_dbus_method_invocation_return_gerror (invocation, err); - G_UNLOCK (machine_info); - goto end; - } - - if ((is_pretty_hostname && !shell_utils_trivial_set_variable (confd_= file, "PRETTY_HOSTNAME", name, TRUE)) || - (!is_pretty_hostname && !shell_utils_trivial_set_variable (confd= _file, "ICON_NAME", name, TRUE))) - { - g_dbus_method_invocation_return_dbus_error (invocation, - DBUS_ERROR_FAILED, - "Failed to value in = " SYSCONFDIR "/machine-info"); - G_UNLOCK (machine_info); - goto end; - } - - if (!shell_utils_trivial_save (confd_file, &err)) { + if ((is_pretty_hostname && + !shell_utils_trivial_set_and_save (machine_info_file, &err, = "PRETTY_HOSTNAME", NULL, name, NULL)) || + (!is_pretty_hostname && + !shell_utils_trivial_set_and_save (machine_info_file, &err, = "ICON_NAME", NULL, name, NULL))) { g_dbus_method_invocation_return_gerror (invocation, err); G_UNLOCK (machine_info); goto end; @@ -354,13 +323,16 @@ hostnamed_init (gboolean _read_only) hostname[0] =3D 0; } =20 - static_hostname =3D shell_utils_source_var (SYSCONFDIR "/conf.d/host= name", "${hostname-${HOSTNAME-localhost}}", &err); + static_hostname_file =3D g_file_new_for_path (SYSCONFDIR "/conf.d/ho= stname"); + machine_info_file =3D g_file_new_for_path (SYSCONFDIR "/machine-info= "); + + static_hostname =3D shell_utils_source_var (static_hostname_file, "$= {hostname-${HOSTNAME-localhost}}", &err); if (err !=3D NULL) { g_debug ("%s", err->message); g_error_free (err); err =3D NULL; } - pretty_hostname =3D shell_utils_source_var (SYSCONFDIR "/machine-inf= o", "${PRETTY_HOSTNAME}", &err); + pretty_hostname =3D shell_utils_source_var (machine_info_file, "${PR= ETTY_HOSTNAME}", &err); if (pretty_hostname =3D=3D NULL) pretty_hostname =3D g_strdup (""); if (err !=3D NULL) { @@ -368,7 +340,7 @@ hostnamed_init (gboolean _read_only) g_error_free (err); err =3D NULL; } - icon_name =3D shell_utils_source_var (SYSCONFDIR "/machine-info", "$= {ICON_NAME}", &err); + icon_name =3D shell_utils_source_var (machine_info_file, "${ICON_NAM= E}", &err); if (icon_name =3D=3D NULL) icon_name =3D g_strdup (""); if (err !=3D NULL) { @@ -402,4 +374,7 @@ hostnamed_destroy (void) g_free (static_hostname); g_free (pretty_hostname); g_free (icon_name); + + g_object_unref (static_hostname_file); + g_object_unref (machine_info_file); } \ No newline at end of file diff --git a/src/shell-utils.c b/src/shell-utils.c index 6371ef1..4f76fee 100644 --- a/src/shell-utils.c +++ b/src/shell-utils.c @@ -16,15 +16,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 = USA */ =20 -#include -#include -#include +#include #include -#include -#include =20 #include -#include #include =20 #include "shell-utils.h" @@ -53,23 +48,53 @@ struct ShellEntry { }; =20 gchar * -shell_utils_source_var (const gchar *filename, +shell_utils_source_var (GFile *file, const gchar *variable, GError **error) { gchar *argv[4] =3D { "sh", "-c", NULL, NULL }; - gchar *quoted_filename =3D NULL; + gchar *filename, *quoted_filename; gchar *output =3D NULL; + GFileInfo *info; + const GFileAttributeInfo *attribute_info; + + filename =3D g_file_get_path (file); + if ((info =3D g_file_query_info (file, G_FILE_ATTRIBUTE_STANDARD_TYP= E "," G_FILE_ATTRIBUTE_ACCESS_CAN_READ, G_FILE_QUERY_INFO_NONE, NULL, err= or)) =3D=3D NULL) { + g_prefix_error (error, "Unable to source '%s': ", filename); + goto out; + } + + if (g_file_info_get_file_type (info) !=3D G_FILE_TYPE_REGULAR && + g_file_info_get_file_type (info) !=3D G_FILE_TYPE_SYMBOLIC_LINK)= { + g_propagate_error (error, + g_error_new (G_FILE_ERROR, G_FILE_ERROR_FAILE= D, + "Unable to source '%s': not a re= gular file", filename)); + goto out; + } + + if (!g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCES= S_CAN_READ)) { + g_propagate_error (error, + g_error_new (G_FILE_ERROR, G_FILE_ERROR_ACCES= , + "Unable to source '%s': permissi= on denied", filename)); + goto out; + } =20 quoted_filename =3D g_shell_quote (filename); argv[2] =3D g_strdup_printf (". %s; echo -n %s", quoted_filename, va= riable); - g_free (quoted_filename); =20 - if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) - if (!g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, = NULL, &output, NULL, NULL, error)) { - g_prefix_error (error, "Unable to source '%s': ", filename); - } - g_free (argv[2]); + if (!g_spawn_sync (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL= , &output, NULL, NULL, error)) { + g_prefix_error (error, "Unable to source '%s': ", filename); + } + + out: + if (filename !=3D NULL) + g_free (filename); + if (quoted_filename !=3D NULL) + g_free (quoted_filename); + if (info !=3D NULL) + g_object_unref (info); + if (argv[2] !=3D NULL) + g_free (argv[2]); return output; } =20 @@ -92,6 +117,8 @@ shell_utils_trivial_free (ShellUtilsTrivial *trivial) if (trivial =3D=3D NULL) return; =20 + if (trivial->file !=3D NULL) + g_object_unref (trivial->file); if (trivial->filename !=3D NULL) g_free (trivial->filename); if (trivial->entry_list !=3D NULL) @@ -100,7 +127,7 @@ shell_utils_trivial_free (ShellUtilsTrivial *trivial) } =20 ShellUtilsTrivial * -shell_utils_trivial_new (const gchar *filename, +shell_utils_trivial_new (GFile *file, GError **error) { gchar *filebuf =3D NULL; @@ -108,20 +135,23 @@ shell_utils_trivial_new (const gchar *filename, GError *local_err; gchar *s; =20 - g_assert (filename !=3D NULL); + if (file =3D=3D NULL) + return NULL; =20 ret =3D g_new0 (ShellUtilsTrivial, 1); - ret->filename =3D g_strdup (filename); + g_object_ref (file); + ret->file =3D file; + ret->filename =3D g_file_get_path (file); =20 - if (!g_file_get_contents (filename, &filebuf, NULL, &local_err)) { + if (!g_file_load_contents (file, NULL, &filebuf, NULL, NULL, &local_= err)) { if (local_err !=3D NULL) { /* Inability to parse or open is a failure; file not existin= g at all is *not* a failure */ - if (local_err->code =3D=3D G_FILE_ERROR_NOENT) { + if (local_err->code =3D=3D G_IO_ERROR_NOT_FOUND) { g_error_free (local_err); return ret; } =20 - g_propagate_prefixed_error (error, local_err, "Unable to rea= d '%s':", filename); + g_propagate_prefixed_error (error, local_err, "Unable to rea= d '%s':", ret->filename); } shell_utils_trivial_free (ret); return NULL; @@ -261,7 +291,7 @@ no_match: match_info =3D NULL; g_propagate_error (error, g_error_new (G_FILE_ERROR, G_FILE_ERROR_FAILE= D, - "Unable to parse '%s'", filename= )); + "Unable to parse '%s'", ret->fil= ename)); shell_utils_trivial_free (ret); return NULL; } @@ -317,86 +347,91 @@ gboolean shell_utils_trivial_save (ShellUtilsTrivial *trivial, GError **error) { + gboolean ret =3D FALSE; GList *curr =3D NULL; - gchar *temp_filename =3D NULL; - gint fd; - gboolean retval =3D FALSE; - GStatBuf stat_buf; - gint mode =3D S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; /* 644 by defau= lt */ + GFileOutputStream *os; =20 - g_assert (trivial !=3D NULL); - g_assert (trivial->filename !=3D NULL); - - /* If the file exists, preserve its mode */ - if (!g_lstat (trivial->filename, &stat_buf)) - mode =3D stat_buf.st_mode; - - temp_filename =3D g_strdup_printf ("%s.XXXXXX", trivial->filename); - - if ((fd =3D g_mkstemp_full (temp_filename, O_WRONLY, mode)) < 0) { - int errsv =3D errno; - GFileError file_err; - file_err =3D g_file_error_from_errno (errsv); - g_propagate_prefixed_error (error, - g_error_copy ((GError*)&file_err), - "Unable to write '%s': Unable to cre= ate temp file: ", - trivial->filename); + g_assert (trivial !=3D NULL && trivial->file !=3D NULL && trivial->f= ilename !=3D NULL); + if ((os =3D g_file_replace (trivial->file, NULL, FALSE, G_FILE_CREAT= E_NONE, NULL, error)) =3D=3D NULL) { + g_prefix_error (error, "Unable to save '%s': ", trivial->filenam= e); goto out; } =20 for (curr =3D trivial->entry_list; curr !=3D NULL; curr =3D curr->ne= xt) { struct ShellEntry *entry; - ssize_t written; + gsize written; =20 entry =3D (struct ShellEntry *)(curr->data); - written =3D write (fd, entry->string, strlen (entry->string)); - int errsv =3D errno; - if (written < strlen (entry->string)) { - if (written < 0) { - int errsv =3D errno; - GFileError file_err; - file_err =3D g_file_error_from_errno (errsv); - g_propagate_prefixed_error (error, - g_error_copy ((GError*)&file= _err), - "Unable to write temp file '= %s': ", - temp_filename); - } else { - g_propagate_error (error, - g_error_new (G_FILE_ERROR, G_FILE_ERR= OR_FAILED, - "Unable to write temp fi= le '%s'", temp_filename)); - } - close (fd); + if (!g_output_stream_write_all (G_OUTPUT_STREAM (os), entry->str= ing, strlen (entry->string), &written, NULL, error)) { + g_prefix_error (error, "Unable to save '%s': ", trivial->fil= ename); goto out; } } - if (fsync (fd) || close (fd)) { - int errsv =3D errno; - GFileError file_err; - file_err =3D g_file_error_from_errno (errsv); - g_propagate_prefixed_error (error, - g_error_copy ((GError*)&file_err), - "Unable to sync or close temp file '= %s': ", - temp_filename); - close (fd); + =20 + if (!g_output_stream_close (G_OUTPUT_STREAM (os), NULL, error)) { + g_prefix_error (error, "Unable to save '%s': ", trivial->filenam= e); + g_output_stream_close (G_OUTPUT_STREAM (os), NULL, NULL); goto out; } + ret =3D TRUE; + + out: + if (os) + g_object_unref (os); + return ret; +} =20 - if (g_rename (temp_filename, trivial->filename) < 0) { - int errsv =3D errno; - GFileError file_err; - file_err =3D g_file_error_from_errno (errsv); - g_propagate_prefixed_error (error, - g_error_copy ((GError*)&file_err), - "Unable to copy '%s' to '%s': ", - temp_filename, trivial->filename); +gboolean +shell_utils_trivial_set_and_save (GFile *file, + GError **error, + const gchar *first_var_name, + const gchar *first_alt_var_name, + const gchar *first_value, + ...) +{ + va_list ap; + ShellUtilsTrivial *trivial; + gboolean ret =3D FALSE; + const gchar *var_name, *alt_var_name, *value; + + va_start (ap, first_value); + if ((trivial =3D shell_utils_trivial_new (file, error)) =3D=3D NULL) goto out; - } - retval =3D TRUE; + + var_name =3D first_var_name; + alt_var_name =3D first_alt_var_name; + value =3D first_value; + do { + if (alt_var_name =3D=3D NULL) { + if (!shell_utils_trivial_set_variable (trivial, var_name, va= lue, TRUE)) { + g_propagate_error (error, + g_error_new (G_FILE_ERROR, G_FILE_ERROR_FAILED, + "Unable to set %s in '%s'", var_name= , trivial->filename)); + goto out; + } + } else { + if (!shell_utils_trivial_set_variable (trivial, var_name, va= lue, FALSE) && + !shell_utils_trivial_set_variable (trivial, alt_var_name= , value, FALSE) && + !shell_utils_trivial_set_variable (trivial, var_name, va= lue, TRUE)) { + g_propagate_error (error, + g_error_new (G_FILE_ERROR, G_FILE_ERROR_FAIL= ED, + "Unable to set %s or %s in '%s'"= , var_name, alt_var_name, trivial->filename)); + goto out; + } + } + } while ((var_name =3D va_arg (ap, const gchar*)) !=3D NULL ? + alt_var_name =3D va_arg (ap, const gchar*), value =3D v= a_arg (ap, const gchar*), 1 : 0); + + if (!shell_utils_trivial_save (trivial, error)) + goto out; + + ret =3D TRUE; =20 out: - g_free (temp_filename); - g_unlink (temp_filename); - return retval; + va_end (ap); + if (trivial !=3D NULL) + shell_utils_trivial_free (trivial); + return ret; } =20 void diff --git a/src/shell-utils.h b/src/shell-utils.h index 861cd87..5e1863d 100644 --- a/src/shell-utils.h +++ b/src/shell-utils.h @@ -20,17 +20,19 @@ #define _SHELL_UTILS_H_ =20 #include +#include =20 typedef struct _ShellUtilsTrivial ShellUtilsTrivial; =20 struct _ShellUtilsTrivial { + GFile *file; gchar *filename; GList *entry_list; }; =20 gchar * -shell_utils_source_var (const gchar *filename, +shell_utils_source_var (GFile *file, const gchar *variable, GError **error); =20 @@ -41,7 +43,7 @@ void shell_utils_destroy (void); =20 ShellUtilsTrivial * -shell_utils_trivial_new (const gchar *filename, +shell_utils_trivial_new (GFile *file, GError **error); =20 void @@ -57,4 +59,11 @@ gboolean shell_utils_trivial_save (ShellUtilsTrivial *trivial, GError **error); =20 +gboolean +shell_utils_trivial_set_and_save (GFile *file, + GError **error, + const gchar *first_var_name, + const gchar *first_alt_var_name, + const gchar *first_value, + ...); #endif