chiark / gitweb /
rename saddr -> saddr4, prep for v6 support
[authbind.git] / helper.c
index 5bd95fd24dbc8ed66d6826508cf02ed4f9f45a3d..7cfd91ad48e14e8fdfbfc7a5eaa10241f8acc949 100644 (file)
--- a/helper.c
+++ b/helper.c
@@ -48,14 +48,14 @@ static void perrorfail(const char *m) {
 }
 
 static void badusage(void) {
-  fprintf(stderr,"libauthbind's helper: bad usage\n %s\n",rcsid);
+  fprintf(stderr,"libauthbind's helper: bad usage\n (%s)\n",rcsid);
   exit(ENOSYS);
 }
 
-static struct sockaddr_in saddr;
+static struct sockaddr_in saddr4;
 
 static void authorised(void) {
-  if (bind(0,&saddr,sizeof(saddr))) exiterrno(errno);
+  if (bind(0,&saddr4,sizeof(saddr4))) exiterrno(errno);
   else _exit(0);
 }
 
@@ -72,21 +72,22 @@ int main(int argc, const char *const *argv) {
   if (argc != 3) badusage(); 
   addr= strtoul(argv[1],&ep,16); if (*ep || addr&~0x0ffffffffUL) badusage();
   port= strtoul(argv[2],&ep,16); if (*ep || port&~0x0ffffUL) badusage();
+  hport= htons(port);
+  if (hport >= IPPORT_RESERVED/2) _exit(EPERM);
 
   if (chdir(CONFIGDIR)) perrorfail("chdir " CONFIGDIR);
 
   fnbuf[sizeof(fnbuf)-1]= 0;
-  memset(&saddr,0,sizeof(saddr));
-  saddr.sin_family= AF_INET;
-  saddr.sin_port= port;
-  saddr.sin_addr.s_addr= addr;
-  hport= htons(port);
+  memset(&saddr4,0,sizeof(saddr4));
+  saddr4.sin_family= AF_INET;
+  saddr4.sin_port= port;
+  saddr4.sin_addr.s_addr= addr;
 
   snprintf(fnbuf,sizeof(fnbuf)-1,"byport/%u",hport);
   if (!access(fnbuf,X_OK)) authorised();
   if (errno != ENOENT) exiterrno(errno);
 
-  np= inet_ntoa(saddr.sin_addr); assert(np);
+  np= inet_ntoa(saddr4.sin_addr); assert(np);
   snprintf(fnbuf,sizeof(fnbuf)-1,"byaddr/%s:%u",np,hport);
   if (!access(fnbuf,X_OK)) authorised();
   if (errno != ENOENT) exiterrno(errno);