Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/entrance

Dir     : e17/apps/entrance/src/client


Modified Files:
        entrance_login.c entrance_session.c 


Log Message:


moe loging - and ACTUALLY work. executing entrance_login via bin/sh loses
child process info etc thus waitpit() will never wait for the x session. exe
directly ith no shell in between - and now its all happy.

===================================================================
RCS file: /cvs/e/e17/apps/entrance/src/client/entrance_login.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -3 -r1.5 -r1.6
--- entrance_login.c    16 Aug 2005 04:03:27 -0000      1.5
+++ entrance_login.c    28 Sep 2006 03:17:46 -0000      1.6
@@ -3,6 +3,8 @@
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/wait.h>
+#include <errno.h>
+#include <signal.h>
 
 #include "../config.h"
 
@@ -29,10 +31,18 @@
 }
 #endif
 
+static void
+child(int sig, siginfo_t *si, void *foo)
+{
+   syslog(LOG_INFO, "Child exit signal.");
+}
+
 int
 main(int argc, char **argv)
 {
    pid_t pid = -1;
+   int status;
+   struct sigaction action;
 
 #ifdef HAVE_PAM
    char *user = NULL;
@@ -59,10 +69,11 @@
    }
 
    pid = atoi(argv[1]);
-#if HAVE_PAM
+#ifdef HAVE_PAM
    user = argv[2];
    display = argv[3];
 
+   syslog(LOG_CRIT, "Wait for %s on %s", user, display);
    if (user && display)
    {
       e = entrance_auth_new();
@@ -75,7 +86,12 @@
    }
 #endif
 
-   if (waitpid(pid, NULL, 0) == pid)
+   action.sa_sigaction = child;
+   action.sa_flags = SA_RESTART | SA_SIGINFO;
+   sigemptyset(&action.sa_mask);
+   sigaction(SIGCHLD, &action, NULL);
+   syslog(LOG_CRIT, "Wait for pid %i", pid);
+   if (waitpid(pid, &status, 0) == pid)
    {
 #ifdef HAVE_PAM
       if (e)
@@ -85,8 +101,10 @@
          entrance_auth_free(e);
       }
 #endif
+      syslog(LOG_CRIT, "Wait done - child exited normally");
       closelog();
       exit(0);
    }
+   syslog(LOG_CRIT, "Wait error: %s", strerror(errno));
    return -1;
 }
===================================================================
RCS file: /cvs/e/e17/apps/entrance/src/client/entrance_session.c,v
retrieving revision 1.88
retrieving revision 1.89
diff -u -3 -r1.88 -r1.89
--- entrance_session.c  27 Sep 2006 12:11:47 -0000      1.88
+++ entrance_session.c  28 Sep 2006 03:17:46 -0000      1.89
@@ -378,7 +378,7 @@
 entrance_session_start_user_session(Entrance_Session * e)
 {
    pid_t pid;
-   char buf[PATH_MAX];
+   char buf[PATH_MAX], pids[128];
    char *shell = NULL;
    char *user = NULL;
    struct passwd *pwent = NULL;
@@ -472,7 +472,7 @@
         /* replace this process with a clean small one that just waits for its 
*/
         /* child to exit.. passed on the cmd-line */
 
-        _entrance_session_execute_in_shell(user,shell,buf);
+        _entrance_session_execute_in_shell(user, shell, buf);
         break;
      case -1:
         syslog(LOG_INFO, "FORK FAILED, UH OH");
@@ -482,20 +482,20 @@
 #ifdef HAVE_PAM
         if (e->config->auth == ENTRANCE_USE_PAM)
         {
-           snprintf(buf, sizeof(buf), "%s/%s/entrance_login %i %s %s",
+           snprintf(buf, sizeof(buf), "%s/%s/entrance_login",
                     PACKAGE_LIB_DIR, PACKAGE, (int) pid, pwent->pw_name, 
                    e->display);
         }
         else
 #endif
         {
-           snprintf(buf, sizeof(buf), "%s/%s/entrance_login %i",
+           snprintf(buf, sizeof(buf), "%s/%s/entrance_login",
                     PACKAGE_LIB_DIR, PACKAGE, (int) pid);
         }
         shell = strdup("/bin/sh");
         /* this bypasses a race condition where entrance loses its x
            connection before the wm gets it and x goes and resets itself */
-        sleep(10);
+        sleep(30);
         /*
          * FIXME These should be called!
         ecore_x_shutdown();
@@ -503,14 +503,31 @@
         */
         break;
    }
+/* no need to free - we are goign to exec ourselves and be replaced   
    struct_passwd_free(pwent);
    entrance_session_free(e);
    if (shell) free(shell);
    if (user) free(user);
+ */
    /* replace this process with a clean small one that just waits for its */
    /* child to exit.. passed on the cmd-line */
 
-   execl("/bin/sh", "/bin/sh", "-l", "-c", buf, NULL);
+   /* this causes entreance to reset - bad bad bad */
+   snprintf(pids, sizeof(pids), "%i", (int)pid);
+   snprintf(buf, sizeof(buf), "%s/%s/entrance_login", PACKAGE_LIB_DIR, 
PACKAGE);
+#ifdef HAVE_PAM
+   if (e->config->auth == ENTRANCE_USE_PAM)
+     {
+       syslog(LOG_NOTICE, "Exec entrance login replacement: %s %s %s %s", buf, 
pids, pwent->pw_name, e->display);
+       execl(buf, buf, pids, pwent->pw_name, e->display, NULL);
+     }
+   else
+#endif
+     {
+       syslog(LOG_NOTICE, "Exec entrance login replacement: %s %s", buf, pids);
+       execl(buf, buf, pids, NULL);
+     }
+   pause();
    if (buf) free(buf);
 }
 



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys -- and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to