diff options
| author | William Jon McCann <mccann@jhu.edu> | 2007-02-26 15:18:49 -0500 | 
|---|---|---|
| committer | William Jon McCann <mccann@jhu.edu> | 2007-02-26 15:18:49 -0500 | 
| commit | 35b022fde7836d0edb5819d4f8be29bd1b9a20d9 (patch) | |
| tree | 9bbcd8afc63999cf9f079564c6a56e78fcf77f2c /src | |
| parent | 8fa6f59953fbcae779008c7cdf12441e995b1ca3 (diff) | |
rename some items in proc.h api; add some more error checking
Make the proc.h API more coherent.  Convert some warnings
to debug statements.  Fix two leaks.  Add more error checking.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ck-manager.c | 104 | ||||
| -rw-r--r-- | src/proc-linux.c | 42 | ||||
| -rw-r--r-- | src/proc.h | 17 | 
3 files changed, 99 insertions, 64 deletions
diff --git a/src/ck-manager.c b/src/ck-manager.c index 63561b3..71734d8 100644 --- a/src/ck-manager.c +++ b/src/ck-manager.c @@ -300,7 +300,7 @@ get_caller_info (CkManager   *manager,                                   G_TYPE_INVALID,                                   G_TYPE_UINT, calling_uid,                                   G_TYPE_INVALID)) { -                g_warning ("GetConnectionUnixUser() failed: %s", error->message); +                ck_debug ("GetConnectionUnixUser() failed: %s", error->message);                  g_error_free (error);                  goto out;          } @@ -310,7 +310,7 @@ get_caller_info (CkManager   *manager,                                   G_TYPE_INVALID,                                   G_TYPE_UINT, calling_pid,                                   G_TYPE_INVALID)) { -                g_warning ("GetConnectionUnixProcessID() failed: %s", error->message); +                ck_debug ("GetConnectionUnixProcessID() failed: %s", error->message);                  g_error_free (error);                  goto out;          } @@ -452,18 +452,19 @@ create_session_for_caller (CkManager       *manager,                             const GPtrArray *parameters,                             GError         **error)  { -        char       *ssid; -        proc_t     *stat; -        char       *cmd; -        char       *xdisplay; -        char       *tty; -        CkSession  *session; -        CkSeat     *seat; -        char       *cookie; -        pid_t       pid; -        uid_t       uid; -        gboolean    res; -        LeaderInfo *leader_info; +        char        *ssid; +        proc_stat_t *stat; +        char        *cmd; +        char        *xdisplay; +        char        *tty; +        CkSession   *session; +        CkSeat      *seat; +        char        *cookie; +        pid_t        pid; +        uid_t        uid; +        gboolean     res; +        LeaderInfo  *leader_info; +        GError      *local_error;          res = get_caller_info (manager,                                 sender, @@ -488,7 +489,7 @@ create_session_for_caller (CkManager       *manager,                                                    parameters);          if (session == NULL) { -                g_warning ("Unable to create new session"); +                ck_debug ("Unable to create new session");                  g_free (cookie);                  cookie = NULL;                  g_set_error (error, @@ -498,11 +499,25 @@ create_session_for_caller (CkManager       *manager,                  goto out;          } -        proc_stat_pid (pid, &stat); -        tty = proc_get_tty (stat); -        cmd = proc_get_cmd (stat); +        local_error = NULL; +        res = proc_stat_new_for_pid (pid, &stat, &local_error); +        if (! res) { +                g_set_error (error, +                             CK_MANAGER_ERROR, +                             CK_MANAGER_ERROR_GENERAL, +                             _("Unable to lookup information about calling process '%d'"), +                             pid); +                if (local_error != NULL) { +                        ck_debug ("stat on pid %d failed: %s", pid, local_error->message); +                        g_error_free (local_error); +                } +                return FALSE; +        } + +        tty = proc_stat_get_tty (stat); +        cmd = proc_stat_get_cmd (stat);          xdisplay = NULL; -        proc_free (stat); +        proc_stat_free (stat);          /* If the parameters are not set then try to get them */          if (parameters == NULL) { @@ -565,14 +580,15 @@ ck_manager_get_session_for_cookie (CkManager             *manager,                                     const char            *cookie,                                     DBusGMethodInvocation *context)  { -        gboolean    res; -        char       *sender; -        uid_t       calling_uid; -        pid_t       calling_pid; -        proc_t     *stat; -        char       *ssid; -        CkSession  *session; -        LeaderInfo *leader_info; +        gboolean     res; +        char        *sender; +        uid_t        calling_uid; +        pid_t        calling_pid; +        proc_stat_t *stat; +        char        *ssid; +        CkSession   *session; +        LeaderInfo  *leader_info; +        GError      *local_error;          ssid = NULL; @@ -594,20 +610,26 @@ ck_manager_get_session_for_cookie (CkManager             *manager,                  return FALSE;          } -        res = proc_stat_pid (calling_pid, &stat); +        local_error = NULL; +        res = proc_stat_new_for_pid (calling_pid, &stat, &local_error);          if (! res) {                  GError *error;                  error = g_error_new (CK_MANAGER_ERROR,                                       CK_MANAGER_ERROR_GENERAL,                                       _("Unable to lookup information about calling process '%d'"),                                       calling_pid); -                g_warning ("stat on pid %d failed", calling_pid); +                if (local_error != NULL) { +                        ck_debug ("stat on pid %d failed: %s", calling_pid, local_error->message); +                        g_error_free (local_error); +                } +                  dbus_g_method_return_error (context, error);                  g_error_free (error);                  return FALSE;          }          /* FIXME: should we restrict this by uid? */ +        proc_stat_free (stat);          leader_info = g_hash_table_lookup (manager->priv->leaders, cookie);          if (leader_info == NULL) { @@ -648,7 +670,7 @@ get_cookie_for_pid (CkManager *manager,          /* FIXME: need a better way to get the cookie */ -        cookie = proc_get_env (pid, "XDG_SESSION_COOKIE"); +        cookie = proc_pid_get_env (pid, "XDG_SESSION_COOKIE");          return cookie;  } @@ -665,12 +687,13 @@ ck_manager_get_session_for_unix_process (CkManager             *manager,                                           guint                  pid,                                           DBusGMethodInvocation *context)  { -        gboolean    res; -        char       *sender; -        uid_t       calling_uid; -        pid_t       calling_pid; -        proc_t     *stat; -        char       *cookie; +        gboolean     res; +        char        *sender; +        uid_t        calling_uid; +        pid_t        calling_pid; +        proc_stat_t *stat; +        char        *cookie; +        GError      *error;          sender = dbus_g_method_get_sender (context); @@ -690,10 +713,11 @@ ck_manager_get_session_for_unix_process (CkManager             *manager,                  return FALSE;          } -        res = proc_stat_pid (calling_pid, &stat); +        error = NULL; +        res = proc_stat_new_for_pid (calling_pid, &stat, &error);          if (! res) {                  GError *error; -                g_warning ("stat on pid %d failed", calling_pid); +                ck_debug ("stat on pid %d failed", calling_pid);                  error = g_error_new (CK_MANAGER_ERROR,                                       CK_MANAGER_ERROR_GENERAL,                                       _("Unable to lookup information about calling process '%d'"), @@ -703,6 +727,10 @@ ck_manager_get_session_for_unix_process (CkManager             *manager,                  return FALSE;          } +        /* FIXME: check stuff? */ + +        proc_stat_free (stat); +          cookie = get_cookie_for_pid (manager, pid);          if (cookie == NULL) {                  GError *error; diff --git a/src/proc-linux.c b/src/proc-linux.c index 997825e..080293e 100644 --- a/src/proc-linux.c +++ b/src/proc-linux.c @@ -30,7 +30,8 @@  #include "proc.h" -struct _proc_t +/* adapted from procps */ +struct _proc_stat_t  {          int pid;          int ppid;                       /* stat,status     pid of parent process */ @@ -258,14 +259,14 @@ link_name (guint       maj,  }  char * -proc_get_cmd (proc_t *stat) +proc_stat_get_cmd (proc_stat_t *stat)  {          return g_strdup (stat->cmd);  }  /* adapted from procps */  char * -proc_get_tty (proc_t *stat) +proc_stat_get_tty (proc_stat_t *stat)  {          guint dev;          char *tty; @@ -311,8 +312,8 @@ proc_get_tty (proc_t *stat)  #define KLF "l"  /* adapted from procps */  static void -stat2proc (const char *S, -           proc_t     *P) +stat2proc (const char  *S, +           proc_stat_t *P)  {          unsigned num;          char   * tmp; @@ -375,15 +376,16 @@ stat2proc (const char *S,  }  gboolean -proc_stat_pid (pid_t    pid, -               proc_t **stat) +proc_stat_new_for_pid (pid_t         pid, +                       proc_stat_t **stat, +                       GError      **error)  { -        char    *path; -        char    *contents; -        gsize    length; -        gboolean res; -        GError  *error; -        proc_t  *proc; +        char        *path; +        char        *contents; +        gsize        length; +        gboolean     res; +        GError      *local_error; +        proc_stat_t *proc;          if (stat == NULL) {                  return FALSE; @@ -392,15 +394,19 @@ proc_stat_pid (pid_t    pid,          path = g_strdup_printf ("/proc/%d/stat", pid);          contents = NULL; +        local_error = NULL;          res = g_file_get_contents (path,                                     &contents,                                     &length, -                                   &error); +                                   &local_error);          if (res) { -                proc = g_new0 (proc_t, 1); +                proc = g_new0 (proc_stat_t, 1);                  proc->pid = pid;                  stat2proc (contents, proc);                  *stat = proc; +        } else { +                g_propagate_error (error, local_error); +                *stat = NULL;          }          g_free (contents); @@ -410,14 +416,14 @@ proc_stat_pid (pid_t    pid,  }  void -proc_free (proc_t *stat) +proc_stat_free (proc_stat_t *stat)  {          g_free (stat);  }  char * -proc_get_env (pid_t       pid, -              const char *var) +proc_pid_get_env (pid_t       pid, +                  const char *var)  {          char      *path;          gboolean   res; @@ -25,16 +25,17 @@  G_BEGIN_DECLS -typedef struct _proc_t proc_t; +typedef struct _proc_stat_t proc_stat_t; -gboolean proc_stat_pid (pid_t    pid, -                        proc_t **stat); -char    *proc_get_tty  (proc_t  *stat); -char    *proc_get_cmd  (proc_t  *stat); -void     proc_free     (proc_t  *stat); +gboolean proc_stat_new_for_pid (pid_t         pid, +                                proc_stat_t **stat, +                                GError      **error); +char    *proc_stat_get_tty     (proc_stat_t  *stat); +char    *proc_stat_get_cmd     (proc_stat_t  *stat); +void     proc_stat_free        (proc_stat_t  *stat); -char    *proc_get_env  (pid_t       pid, -                        const char *var); +char    *proc_pid_get_env      (pid_t         pid, +                                const char   *var);  G_END_DECLS  | 
