opnsense-ports/sysutils/consolekit/files/patch-src_ck-sysdeps-freebsd.c
Franco Fichtner a737ce6b05 */*: sync previously available, but unused ports
Taken from: FreeBSD
2015-04-22 06:45:04 +02:00

208 lines
6 KiB
C

--- src/ck-sysdeps-freebsd.c.orig 2010-09-03 15:54:31.000000000 +0200
+++ src/ck-sysdeps-freebsd.c 2015-03-23 09:28:20.476513000 +0100
@@ -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,
@@ -261,6 +264,9 @@ ck_unix_pid_get_env_hash (pid_t pid)
for (i = 0; penv[i] != NULL; i++) {
char **vals;
+ if (!penv[i][0])
+ continue;
+
vals = g_strsplit (penv[i], "=", 2);
if (vals != NULL) {
g_hash_table_insert (hash,
@@ -270,6 +276,7 @@ ck_unix_pid_get_env_hash (pid_t pid)
}
}
+fail:
kvm_close (kd);
return hash;
@@ -280,7 +287,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 +295,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 +336,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;
}
gboolean
@@ -375,7 +384,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;
}
@@ -385,6 +399,7 @@ ck_get_console_num_from_device (const ch
guint *num)
{
guint n;
+ char c;
gboolean ret;
n = 0;
@@ -394,7 +409,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;
@@ -414,6 +433,7 @@ ck_get_active_console_num (int consol
gboolean ret;
int res;
int active;
+ char ttyn;
g_assert (console_fd != -1);
@@ -426,7 +446,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: