summaryrefslogtreecommitdiffstats
path: root/sysutils/consolekit/files/patch-src_ck-sysdeps-freebsd.c
diff options
context:
space:
mode:
authorkwm <kwm@df743ca5-7f9a-e211-a948-0013205c9059>2011-02-23 03:17:47 +0800
committerkwm <kwm@df743ca5-7f9a-e211-a948-0013205c9059>2011-02-23 03:17:47 +0800
commit72b9440cd4449b64d9ff697341d6fd82a811de32 (patch)
treec81e17f308889d85b5cb113aef01cb7984072e1d /sysutils/consolekit/files/patch-src_ck-sysdeps-freebsd.c
parent3f7c35ea164ccce1ea5736199d7c374ee75f2bb7 (diff)
downloadmarcuscom-ports-72b9440cd4449b64d9ff697341d6fd82a811de32.tar.gz
marcuscom-ports-72b9440cd4449b64d9ff697341d6fd82a811de32.tar.zst
marcuscom-ports-72b9440cd4449b64d9ff697341d6fd82a811de32.zip
Update to 0.4.4.
git-svn-id: svn://creme-brulee.marcuscom.com/ports/trunk@15271 df743ca5-7f9a-e211-a948-0013205c9059
Diffstat (limited to 'sysutils/consolekit/files/patch-src_ck-sysdeps-freebsd.c')
-rw-r--r--sysutils/consolekit/files/patch-src_ck-sysdeps-freebsd.c198
1 files changed, 198 insertions, 0 deletions
diff --git a/sysutils/consolekit/files/patch-src_ck-sysdeps-freebsd.c b/sysutils/consolekit/files/patch-src_ck-sysdeps-freebsd.c
new file mode 100644
index 000000000..d57649345
--- /dev/null
+++ b/sysutils/consolekit/files/patch-src_ck-sysdeps-freebsd.c
@@ -0,0 +1,198 @@
+--- src/ck-sysdeps-freebsd.c.orig 2008-04-03 20:36:21.000000000 -0400
++++ src/ck-sysdeps-freebsd.c 2009-04-18 18:04:39.000000000 -0400
+@@ -27,6 +27,7 @@
+ #include <unistd.h>
+ #include <string.h>
+ #include <errno.h>
++#include <glob.h>
+ #include <paths.h>
+ #include <ttyent.h>
+ #include <kvm.h>
+@@ -202,7 +203,6 @@ ck_process_stat_new_for_unix_pid (pid_t
+ GError **error)
+ {
+ gboolean res;
+- GError *local_error;
+ CkProcessStat *proc;
+
+ g_return_val_if_fail (pid > 1, FALSE);
+@@ -217,7 +217,6 @@ ck_process_stat_new_for_unix_pid (pid_t
+ if (res) {
+ *stat = proc;
+ } else {
+- g_propagate_error (error, local_error);
+ *stat = NULL;
+ }
+
+@@ -233,24 +232,28 @@ ck_process_stat_free (CkProcessStat *sta
+ GHashTable *
+ ck_unix_pid_get_env_hash (pid_t pid)
+ {
+- GHashTable *hash;
++ GHashTable *hash = NULL;
+ char **penv;
++ char errbuf[_POSIX2_LINE_MAX];
+ kvm_t *kd;
+ struct kinfo_proc p;
+ int i;
+
+- kd = kvm_openfiles (_PATH_DEVNULL, _PATH_DEVNULL, NULL, O_RDONLY, NULL);
++ kd = kvm_openfiles (_PATH_DEVNULL, _PATH_DEVNULL, NULL, O_RDONLY, errbuf);
+ if (kd == NULL) {
++ g_warning ("kvm_openfiles failed: %s", errbuf);
+ return NULL;
+ }
+
+ if (! get_kinfo_proc (pid, &p)) {
+- return NULL;
++ g_warning ("get_kinfo_proc failed: %s", g_strerror (errno));
++ goto fail;
+ }
+
+ penv = kvm_getenvv (kd, &p, 0);
+ if (penv == NULL) {
+- return NULL;
++ g_warning ("kvm_getenvv failed: %s", kvm_geterr (kd));
++ goto fail;
+ }
+
+ hash = g_hash_table_new_full (g_str_hash,
+@@ -270,6 +273,7 @@ ck_unix_pid_get_env_hash (pid_t pid)
+ }
+ }
+
++fail:
+ kvm_close (kd);
+
+ return hash;
+@@ -280,7 +284,7 @@ ck_unix_pid_get_env (pid_t pid,
+ const char *var)
+ {
+ GHashTable *hash;
+- char *val;
++ char *val = NULL;
+
+ /*
+ * Would probably be more efficient to just loop through the
+@@ -288,6 +292,8 @@ ck_unix_pid_get_env (pid_t pid,
+ * table, but this works for now.
+ */
+ hash = ck_unix_pid_get_env_hash (pid);
++ if (hash == NULL)
++ return val;
+ val = g_strdup (g_hash_table_lookup (hash, var));
+ g_hash_table_destroy (hash);
+
+@@ -327,38 +333,38 @@ gboolean
+ ck_get_max_num_consoles (guint *num)
+ {
+ int max_consoles;
+- int res;
+- gboolean ret;
+- struct ttyent *t;
++ int i;
++ glob_t g;
+
+- ret = FALSE;
+ max_consoles = 0;
+
+- res = setttyent ();
+- if (res == 0) {
+- goto done;
+- }
++ g.gl_offs = 0;
++ glob ("/dev/ttyv*", GLOB_DOOFFS | GLOB_NOSORT, NULL, &g);
++ for (i = 0; i < g.gl_pathc && g.gl_pathv[i] != NULL; i++) {
++ struct stat sb;
++ char *cdev;
+
+- while ((t = getttyent ()) != NULL) {
+- if (t->ty_status & TTY_ON && strncmp (t->ty_name, "ttyv", 4) == 0)
++ cdev = g.gl_pathv[i];
++ if (stat (cdev, &sb) > -1 && S_ISCHR (sb.st_mode)) {
+ max_consoles++;
++ } else {
++ break;
++ }
+ }
+
+- /* Increment one more so that all consoles are properly counted
++ globfree (&g);
++
++ /*
++ * Increment one more so that all consoles are properly counted
+ * this is arguable a bug in vt_add_watches().
+ */
+ max_consoles++;
+
+- ret = TRUE;
+-
+- endttyent ();
+-
+-done:
+ if (num != NULL) {
+ *num = max_consoles;
+ }
+
+- return ret;
++ return TRUE;
+ }
+
+ char *
+@@ -369,7 +375,12 @@ ck_get_console_device_for_num (guint num
+ /* The device number is always one less than the VT number. */
+ num--;
+
+- device = g_strdup_printf ("/dev/ttyv%u", num);
++ if (num < 10)
++ device = g_strdup_printf ("/dev/ttyv%i", num);
++ else if (num < 32)
++ device = g_strdup_printf ("/dev/ttyv%c", num - 10 + 'a');
++ else
++ device = NULL;
+
+ return device;
+ }
+@@ -379,6 +390,7 @@ ck_get_console_num_from_device (const ch
+ guint *num)
+ {
+ guint n;
++ char c;
+ gboolean ret;
+
+ n = 0;
+@@ -388,7 +400,11 @@ ck_get_console_num_from_device (const ch
+ return FALSE;
+ }
+
+- if (sscanf (device, "/dev/ttyv%u", &n) == 1) {
++ if (sscanf (device, "/dev/ttyv%c", &c) == 1) {
++ if (c < 58)
++ n = c - 48;
++ else
++ n = c - 'a' + 10;
+ /* The VT number is always one more than the device number. */
+ n++;
+ ret = TRUE;
+@@ -408,6 +424,7 @@ ck_get_active_console_num (int consol
+ gboolean ret;
+ int res;
+ int active;
++ char ttyn;
+
+ g_assert (console_fd != -1);
+
+@@ -420,7 +437,12 @@ ck_get_active_console_num (int consol
+ goto out;
+ }
+
+- g_debug ("Active VT is: %d (ttyv%d)", active, active - 1);
++ if (active - 1 < 10)
++ ttyn = active - 1 + '0';
++ else
++ ttyn = active - 11 + 'a';
++
++ g_debug ("Active VT is: %d (ttyv%c)", active, ttyn);
+ ret = TRUE;
+
+ out: