-/* $Header$
+/* $Id$
*
* This generates the hstath.txt hosttable.
*
- * (c) Copyright 1993 by the Massachusetts Institute of Technology.
- * For copying and distribution information, please see the file
- * <mit-copyright.h>.
+ * (c) Copyright 1993-1998 by the Massachusetts Institute of Technology.
+ * For copying and distribution information, please see the file
+ * <mit-copyright.h>.
*/
#include <mit-copyright.h>
-#include <stdio.h>
#include <moira.h>
-#include <sys/types.h>
+
#include <sys/stat.h>
-#include <sys/time.h>
+
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include "util.h"
+
EXEC SQL INCLUDE sqlca;
-extern int errno;
+RCSID("$Header$");
+
char *whoami = "hosts.gen";
char *db = "moira/moira";
int main(int argc, char **argv)
{
FILE *out = stdout;
- char *outf = NULL, outft[64], *p, buf[256];
+ char *outf = NULL, outft[MAXPATHLEN], *p;
struct stat sb;
struct timeval now;
int flag1, flag2, i;
struct hash *aliases;
EXEC SQL BEGIN DECLARE SECTION;
int id;
- char name[65], vendor[33], model[33], os[33], addr[17];
+ char name[MACHINE_NAME_SIZE], vendor[MACHINE_VENDOR_SIZE];
+ char model[MACHINE_MODEL_SIZE], os[MACHINE_OS_SIZE];
+ char addr[MACHINE_ADDRESS_SIZE];
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT :db;
continue;
if (!*strtrim(name))
continue;
- if ((i = strlen(name)) < 9 || strcmp(&name[i - 8], ".MIT.EDU"))
+ if ((i = strlen(name)) < 9 || !strchr(name, '.') ||
+ strcmp(strchr(name, '.'), ".MIT.EDU"))
{
- fprintf(stderr, "Name %s not in MIT domain\n", name);
+ fprintf(stderr, "Ignoring alias %s\n", name);
continue;
}
else
name[i - 8] = 0;
- if (p = hash_lookup(aliases, id))
+ if ((p = hash_lookup(aliases, id)))
{
- sprintf(buf, "%s,%s", p, name);
- hash_update(aliases, id, strsave(buf));
- free(p);
+ p = realloc(p, strlen(p) + strlen(name) + 2);
+ sprintf(strchr(p, '\0'), ",%s", name);
+ hash_update(aliases, id, p);
}
else
- hash_store(aliases, id, strsave(name));
+ hash_store(aliases, id, strdup(name));
}
EXEC SQL DECLARE x CURSOR FOR SELECT
name, mach_id, vendor, model, os, address
- FROM machine WHERE status = 1 ORDER BY address;
+ FROM machine WHERE status = 1 AND mach_id > 0
+ ORDER BY address;
EXEC SQL OPEN x;
while (1)
{
EXEC SQL FETCH x INTO :name, :id, :vendor, :model, :os, :addr;
if (sqlca.sqlcode)
break;
- if (id == 0)
- continue;
if (!*strtrim(name))
continue;
- if ((i = strlen(name)) < 9 || strcmp(&name[i - 8], ".MIT.EDU"))
- continue;
+ if ((i = strlen(name)) < 9 || !strchr(name, '.') ||
+ strcmp(strchr(name, '.'), ".MIT.EDU"))
+ {
+ fprintf(stderr, "Ignoring machine %s\n", name);
+ continue;
+ }
else
name[i - 8] = 0;
strtrim(vendor);
strtrim(addr);
if (*addr == 0 || inet_addr(addr) == -1)
continue;
+ fprintf(out, "HOST : %s : %s", addr, name);
if ((p = hash_lookup(aliases, id)))
- sprintf(buf, "%s,%s", name, p);
- else
- strcpy(buf, name);
- fprintf(out, "HOST : %s : %s : ", addr, buf);
+ fprintf(out, ",%s", p);
if ((*vendor || *model) && *os)
{
if (*vendor && *model)
- fprintf(out, "%s/%s : %s :\n", vendor, model, os);
+ fprintf(out, " : %s/%s : %s :\n", vendor, model, os);
else
- fprintf(out, "%s%s : %s :\n", vendor, model, os);
+ fprintf(out, " : %s%s : %s :\n", vendor, model, os);
}
else
- fputs("\n", out);
+ fputs(" : \n", out);
}
EXEC SQL CLOSE x;