diff options
author | kwm <kwm@df743ca5-7f9a-e211-a948-0013205c9059> | 2011-02-23 03:17:47 +0800 |
---|---|---|
committer | kwm <kwm@df743ca5-7f9a-e211-a948-0013205c9059> | 2011-02-23 03:17:47 +0800 |
commit | 72b9440cd4449b64d9ff697341d6fd82a811de32 (patch) | |
tree | c81e17f308889d85b5cb113aef01cb7984072e1d /sysutils/consolekit/files/patch-src_ck-sysdeps-freebsd.c | |
parent | 3f7c35ea164ccce1ea5736199d7c374ee75f2bb7 (diff) | |
download | marcuscom-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.c | 198 |
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: |