#include #include #include #include #include #define SOCKNAME "/var/simpauth/authsocket" #define SIMP_TIMEOUT 45 /* /* returns /* 0 = ok /* 1 = not ok /* 2 = temp error */ int simpauthcheck(user,pass) char *user, *pass; { char buf[BUFSIZ]; int s, tnr, nr, tnw, nw, tl, ret; struct sockaddr_un unixport; struct timeval tymo; fd_set rmask; s=socket(PF_UNIX,SOCK_STREAM,0); if (s<0) return(2); /* There has to be a more standard way of setting the socket name??? */ bzero((char *) &unixport, sizeof(unixport)); unixport.sun_family=PF_UNIX; sprintf(unixport.sun_path,"%.100s",SOCKNAME); if (connect(s, &unixport, sizeof(unixport)) == -1) { close(s); return(2); } sprintf(buf,"%s\n%s\n",user,pass); tnw=0; tl=strlen(buf); while(tnw < tl) { if ((nw=write(s,buf+tnw,tl-tnw)) <= 0) { close(s); return(2); } tnw += nw; } /* clear buffer (to get rid of password) */ bzero(buf,tl); tymo.tv_sec=SIMP_TIMEOUT; tymo.tv_usec=0; FD_ZERO(&rmask); FD_SET(s,&rmask); tnr=0; while(select(getdtablesize(),&rmask,NULL,NULL,&tymo) > 0) { if ((nr=read(s,buf+tnr,BUFSIZ-tnr)) <= 0) { break; } tnr += nr; tymo.tv_sec=SIMP_TIMEOUT; tymo.tv_usec=0; FD_ZERO(&rmask); FD_SET(s,&rmask); } buf[tnr]='\0'; /* // tnr=0; // while((nr=read(s,buf+tnr,BUFSIZ-tnr)) > 0) { tnr += nr; } // buf[tnr]='\0'; */ close(s); if (tnr < 2) { return(2); } else if (strcmp(buf,"0\n") == 0) { return(0); } else if (strcmp(buf,"1\n") == 0) { return(1); } else if (strcmp(buf,"2\n") == 0) { return(2); } else { return(3); /* This can never happen! */ } }