On Sat, 10 Jun 2000, Joel Lansden wrote:

> I know it's cheesy, but you could use some of that free software that
> publishes your dynamic IP address, and put it in one of those free hosting
> services w/ a script...

If you have any machine with a static IP, feel free to use the sources
I've attached. (They won't work for you without some tampering; they're
just the quick hack I'm using to get a static hostname. Make sure the
DNS config file they're modifying has a time-to-live etc set to VERY low 
values (I'm using 1). server needs to be run from inetd.).

LLaP
bero

#include <unistd.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc, char **argv)
{
        struct sockaddr_in sock;
        struct hostent *hp;
        unsigned long addr;
        int sck, conn;

        if(argc!=3) {
                puts("Usage: client hostname password");
                exit(1);
        }
        memset(&sock, 0, sizeof(sock));
        sock.sin_family=AF_INET;
        addr=inet_addr("bero.org");
        if(addr!=(unsigned long)-1)
                memcpy(&sock.sin_addr, &addr, sizeof(addr));
        else {
                hp=gethostbyname("bero.org");
                if(hp==NULL) {
                        perror("gethostbyname");
                        exit(1);
                }
                memcpy(&sock.sin_addr, hp->h_addr, hp->h_length);
        }
        sock.sin_port=htons(1234);
                        
        sck=socket(AF_INET, SOCK_STREAM, 0);
        if(sck<0) {
                perror("socket");       
                exit(1);
        }
        conn=connect(sck, (struct sockaddr *)&sock, sizeof(sock));
        if(conn<0) {
                perror("connect");
                exit(1);
        }
        write(sck, argv[1], strlen(argv[1]));
        write(sck, "\n", 1);
        write(sck, argv[2], strlen(argv[2]));
        write(sck, "\n", 1);
        close(sck);
}
#define _XOPEN_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <string.h>
#include <shadow.h>
int main(int argc, char **argv)
{
        struct sockaddr_in his_addr;
        struct servent *serv;
        int addrlen=sizeof(his_addr);
        unsigned long addr;
        unsigned char *s;
        char *remote_ip=(char *) malloc(16);
        char *host=(char *) malloc(128), *passwd=(char *) malloc(128);
        char *command=(char *) malloc(1024);
        struct spwd *p=(struct spwd *)malloc(sizeof(struct spwd));
        char *cp=NULL;
        if(getpeername(0, (struct sockaddr *) &his_addr, &addrlen)<0) {
/*              perror("getpeername");
                goto sucks; */
        }
        addr=his_addr.sin_addr.s_addr;
        s=(unsigned char*)&addr;
        sprintf(remote_ip, "%u.%u.%u.%u", s[0], s[1], s[2], s[3]);
        fgets(host, 128, stdin);
        if(strchr(host, '\n')) *strchr(host, '\n')=0;
        if(strchr(host, '\r')) *strchr(host, '\r')=0;
        fgets(passwd, 128, stdin);
        if(strchr(passwd, '\n')) *strchr(passwd, '\n')=0;
        if(strchr(passwd, '\r')) *strchr(passwd, '\r')=0;
        p=getspnam(host);
        if(!p) {
                puts("Error");
                goto sucks;
        }
        cp=crypt(passwd, p->sp_pwdp);
        if(strcmp(cp, p->sp_pwdp)) {
                puts("Error");
                goto sucks;
        }

        sprintf(command, "/usr/bin/perl -pi -e \"s,^%s.*,%s\tIN\tA\t%s,g\" 
/var/named/dyn.bero.org", host, host, remote_ip);
        system(command);        
        system("/usr/sbin/ndc reload &>/var/log/ndc.out");

sucks:
        if(host) free(host);
        if(passwd) free(passwd);
        if(remote_ip) free(remote_ip);
        if(command) free(command);
}

Reply via email to