Use accessors for setting adjustment
[vte.git] / gnome-pty-helper / gnome-login-support.c
index 2397b54..c1a3ac6 100644 (file)
@@ -32,7 +32,7 @@ int
 login_tty (int fd)
 {
        pid_t pid = getpid ();
-        
+
        /* Create the session */
        setsid ();
 
@@ -60,7 +60,7 @@ login_tty (int fd)
 #elif defined (TIOCSPGRP)
        ioctl (0, TIOCSPGRP, &pid);
 #endif
-       
+
        dup2 (fd, 0);
        dup2 (fd, 1);
        dup2 (fd, 2);
@@ -79,7 +79,7 @@ pty_open_master_bsd (char *pty_name, int *used_bsd)
        char *ptr1, *ptr2;
 
        *used_bsd = 1;
-       
+
        strcpy (pty_name, "/dev/ptyXX");
        for (ptr1 = "pqrstuvwxyzPQRST"; *ptr1; ++ptr1)
        {
@@ -87,16 +87,16 @@ pty_open_master_bsd (char *pty_name, int *used_bsd)
                for (ptr2 = "0123456789abcdef"; *ptr2; ++ptr2)
                {
                        pty_name [9] = *ptr2;
-                       
+
                        /* Try to open master */
                        if ((pty_master = open (pty_name, O_RDWR)) == -1) {
                                if (errno == ENOENT)  /* Different from EIO */
-                                       return -1;            /* Out of pty devices */
+                                       return -1;    /* Out of pty devices */
                                else
-                                       continue;             /* Try next pty device */
+                                       continue;      /* Try next pty device */
                        }
-                       pty_name [5] = 't';           /* Change "pty" to "tty" */
-                       if (access (pty_name, 6)){
+                       pty_name [5] = 't';            /* Change "pty" to "tty" */
+                       if (access (pty_name, (R_OK | W_OK))){
                                close (pty_master);
                                pty_name [5] = 'p';
                                continue;
@@ -112,11 +112,11 @@ pty_open_slave_bsd (const char *pty_name)
 {
        int pty_slave;
        struct group *group_info = getgrnam ("tty");
-       
+
        if (group_info != NULL)
        {
                /* The following two calls will only succeed if we are root */
-               
+
                chown (pty_name, getuid (), group_info->gr_gid);
                chmod (pty_name, S_IRUSR | S_IWUSR | S_IWGRP);
        }
@@ -148,7 +148,7 @@ static int
 pty_open_slave (const char *pty_name)
 {
        int pty_slave = open (pty_name, O_RDWR);
-       
+
        if (pty_slave == -1)
                return -1;
 
@@ -159,13 +159,13 @@ pty_open_slave (const char *pty_name)
                        close (pty_slave);
                        return -1;
                }
-       
+
     if (!ioctl (pty_slave, I_FIND, "ldterm"))
            if (ioctl (pty_slave, I_PUSH, "ldterm") == -1){
                    close (pty_slave);
                    return -1;
            }
-    
+
 #if !defined(sgi) && !defined(__sgi)
     if (!ioctl (pty_slave, I_FIND, "ttcompat"))
            if (ioctl (pty_slave, I_PUSH, "ttcompat") == -1)
@@ -177,7 +177,7 @@ pty_open_slave (const char *pty_name)
 #endif /* sgi || __sgi */
 #endif /* __osf__ */
 #endif /* HAVE_STROPTS_H */
-    
+
     return pty_slave;
 }
 
@@ -186,23 +186,28 @@ pty_open_master (char *pty_name, int *used_bsd)
 {
        int pty_master;
        char *slave_name;
-       
+
        strcpy (pty_name, "/dev/ptmx");
 
        pty_master = open (pty_name, O_RDWR);
 
+       if ((pty_master == -1) && (errno == ENOENT)) {
+               strcpy (pty_name, "/dev/ptc"); /* AIX */
+               pty_master = open (pty_name, O_RDWR);
+       }
+
        /*
         * Try BSD open, this is needed for Linux which
         * might have Unix98 devices but no kernel support
         * for those.
         */
-       if (pty_master == -1){
+       if (pty_master == -1) {
                *used_bsd = 1;
                return pty_open_master_bsd (pty_name, used_bsd);
        }
        *used_bsd = 0;
 
-       if (grantpt  (pty_master) == -1 || unlockpt (pty_master) == -1){
+       if (grantpt (pty_master) == -1 || unlockpt (pty_master) == -1) {
                close (pty_master);
                return -1;
        }
@@ -219,7 +224,8 @@ pty_open_master (char *pty_name, int *used_bsd)
 #endif
 
 int
-openpty (int *master_fd, int *slave_fd, char *name, struct termios *termp, struct winsize *winp)
+openpty (int *master_fd, int *slave_fd, char *name,
+        struct termios *termp, struct winsize *winp)
 {
        int pty_master, pty_slave, used_bsd = 0;
        struct group *group_info;
@@ -232,13 +238,11 @@ openpty (int *master_fd, int *slave_fd, char *name, struct termios *termp, struc
                return -1;
 
        group_info = getgrnam ("tty");
-       
+
        if (group_info != NULL){
                chown (line, getuid (), group_info->gr_gid);
                chmod (line, S_IRUSR | S_IWUSR | S_IWGRP);
-       }
-       else
-       {
+       } else {
                chown (line, getuid (), -1);
                chmod (line, S_IRUSR | S_IWUSR | S_IWGRP);
        }
@@ -246,13 +250,13 @@ openpty (int *master_fd, int *slave_fd, char *name, struct termios *termp, struc
 #ifdef HAVE_REVOKE
        revoke (line);
 #endif
-       
+
        /* Open slave side */
        if (used_bsd)
                pty_slave = pty_open_slave_bsd (line);
        else
                pty_slave = pty_open_slave (line);
-       
+
        if (pty_slave == -1){
                close (pty_master);
 
@@ -269,7 +273,7 @@ openpty (int *master_fd, int *slave_fd, char *name, struct termios *termp, struc
 
        if (winp)
                ioctl (pty_slave, TIOCSWINSZ, winp);
-       
+
        if (name)
                strcpy (name, line);
 
@@ -281,7 +285,7 @@ forkpty (int *master_fd, char *name, struct termios *termp, struct winsize *winp
 {
        int master, slave;
        pid_t pid;
-       
+
        if (openpty (&master, &slave, name, termp, winp) == -1)
                return -1;
 
@@ -298,32 +302,79 @@ forkpty (int *master_fd, char *name, struct termios *termp, struct winsize *winp
                *master_fd = master;
                close (slave);
        }
-       
+
        return pid;
 }
 #endif /* HAVE_OPENPTY */
 
 int
-n_read (int fd, void *buffer, int n)
+n_read (int fd, void *buf, int count)
 {
-       int left, nread;
-       char *ptr;
-
-       ptr = buffer;
-       left = n;
-       while (left > 0){
-               if ((nread = read (fd, ptr, left)) < 0){
-                       if (errno == EINTR)
-                               nread = 0;
-                       else
+       int n = 0, i;
+       char *buffer;
+
+       buffer = (char*) buf;
+       while (n < count) {
+               i = read (fd, buffer + n, count - n);
+               switch (i) {
+               case -1:
+                       switch (errno) {
+                       case EINTR:
+                       case EAGAIN:
+#ifdef ERESTART
+                       case ERESTART:
+#endif
+                               /* suppress these errors */
+                               break;
+                       default:
                                return -1;
-               } else if (nread == 0)
-                       break;  /* EOF */
-
-               left -= nread;
-               ptr += nread;
+                               break;
+                       }
+                       break;
+               case 0:
+                       return n;
+                       break;
+               default:
+                       n += i;
+                       break;
+               }
        }
-       
-       return n - left;
+
+       return n;
 }
 
+int
+n_write (int fd, const void *buf, int count)
+{
+       int n = 0, i;
+       const char *buffer;
+
+       buffer = (char*) buf;
+       while (n < count) {
+               i = write (fd, buffer + n, count - n);
+               switch (i) {
+               case -1:
+                       switch (errno) {
+                       case EINTR:
+                       case EAGAIN:
+#ifdef ERESTART
+                       case ERESTART:
+#endif
+                               /* suppress these errors */
+                               break;
+                       default:
+                               return -1;
+                               break;
+                       }
+                       break;
+               case 0:
+                       return n;
+                       break;
+               default:
+                       n += i;
+                       break;
+               }
+       }
+
+       return n;
+}