qmail-getpw.c
changeset 0 068428edee47
equal deleted inserted replaced
-1:000000000000 0:068428edee47
       
     1 #include <sys/types.h>
       
     2 #include <sys/stat.h>
       
     3 #include <pwd.h>
       
     4 #include "readwrite.h"
       
     5 #include "substdio.h"
       
     6 #include "subfd.h"
       
     7 #include "error.h"
       
     8 #include "exit.h"
       
     9 #include "byte.h"
       
    10 #include "str.h"
       
    11 #include "case.h"
       
    12 #include "fmt.h"
       
    13 #include "auto_usera.h"
       
    14 #include "auto_break.h"
       
    15 #include "qlx.h"
       
    16 
       
    17 #define GETPW_USERLEN 32
       
    18 
       
    19 char *local;
       
    20 struct passwd *pw;
       
    21 char *dash;
       
    22 char *extension;
       
    23 
       
    24 int userext()
       
    25 {
       
    26   char username[GETPW_USERLEN];
       
    27   struct stat st;
       
    28 
       
    29   extension = local + str_len(local);
       
    30   for (;;) {
       
    31     if (extension - local < sizeof(username))
       
    32       if (!*extension || (*extension == *auto_break)) {
       
    33 	byte_copy(username,extension - local,local);
       
    34 	username[extension - local] = 0;
       
    35 	case_lowers(username);
       
    36 	errno = 0;
       
    37 	pw = getpwnam(username);
       
    38 	if (errno == error_txtbsy) _exit(QLX_SYS);
       
    39 	if (pw)
       
    40 	  if (pw->pw_uid)
       
    41 	    if (stat(pw->pw_dir,&st) == 0) {
       
    42 	      if (st.st_uid == pw->pw_uid) {
       
    43 		dash = "";
       
    44 		if (*extension) { ++extension; dash = "-"; }
       
    45 		return 1;
       
    46 	      }
       
    47 	    }
       
    48 	    else
       
    49 	      if (error_temp(errno)) _exit(QLX_NFS);
       
    50       }
       
    51     if (extension == local) return 0;
       
    52     --extension;
       
    53   }
       
    54 }
       
    55 
       
    56 char num[FMT_ULONG];
       
    57 
       
    58 void main(argc,argv)
       
    59 int argc;
       
    60 char **argv;
       
    61 {
       
    62   local = argv[1];
       
    63   if (!local) _exit(100);
       
    64 
       
    65   if (!userext()) {
       
    66     extension = local;
       
    67     dash = "-";
       
    68     pw = getpwnam(auto_usera);
       
    69   }
       
    70 
       
    71   if (!pw) _exit(QLX_NOALIAS);
       
    72 
       
    73   substdio_puts(subfdoutsmall,pw->pw_name);
       
    74   substdio_put(subfdoutsmall,"",1);
       
    75   substdio_put(subfdoutsmall,num,fmt_ulong(num,(long) pw->pw_uid));
       
    76   substdio_put(subfdoutsmall,"",1);
       
    77   substdio_put(subfdoutsmall,num,fmt_ulong(num,(long) pw->pw_gid));
       
    78   substdio_put(subfdoutsmall,"",1);
       
    79   substdio_puts(subfdoutsmall,pw->pw_dir);
       
    80   substdio_put(subfdoutsmall,"",1);
       
    81   substdio_puts(subfdoutsmall,dash);
       
    82   substdio_put(subfdoutsmall,"",1);
       
    83   substdio_puts(subfdoutsmall,extension);
       
    84   substdio_put(subfdoutsmall,"",1);
       
    85   substdio_flush(subfdoutsmall);
       
    86 
       
    87   _exit(0);
       
    88 }