Ver Fonte

* New settings are saved in binary with ./leaf -0 pack.cfg

svn: 1275
Bryan Drewery há 22 anos atrás
pai
commit
af098e0ee0
9 ficheiros alterados com 353 adições e 217 exclusões
  1. 4 8
      Makefile.in
  2. 0 5
      pack/pack.cfg.sample
  3. 217 17
      src/binary.c
  4. 1 1
      src/binary.h
  5. 6 1
      src/eggdrop.h
  6. 1 1
      src/main.c
  7. 56 184
      src/makesettings.c
  8. 64 0
      src/misc.c
  9. 4 0
      src/misc.h

+ 4 - 8
Makefile.in

@@ -16,7 +16,7 @@ CCDEPMODE = @CCDEPMODE@
 LEAFEXEC = leaf@EXEEXT@
 HUBEXEC = hub@EXEEXT@
 DISTROFILES = config.h.in doc/ misc/ scripts/ ChangeLog Makefile.in build configure pack/ src/
-EXCLUDES = $(CFG) misc/ind doc/DEVEL src/Makefile src/compat/Makefile src/mod/Makefile \
+EXCLUDES = pack/pack.cfg misc/ind doc/DEVEL src/Makefile src/compat/Makefile src/mod/Makefile \
            src/crypto/Makefile src/crypto/.deps src/crypto/.cvsignore \
            src/mod/dns.mod/Makefile src/mod/*.mod/.deps/ src/mod/*.mod/.cvsignore \
            src/.deps src/compat/.deps misc/commit misc/grep autotools/ \
@@ -80,9 +80,9 @@ MAKE_UTILS_NR = $(MAKE) 'CC=$(CC)' 'STRIP=touch' \
 MAKE_CONFIG = $(MAKE) 'MAKE=$(MAKE)'
 
 all:
-	@echo ""
-	@echo "Use the build script."
-	@echo ""
+	echo ""
+	echo "Use the build script"
+	echo ""
 
 cleanutils:
 	@rm -f src/stringfix src/makesettings src/sorthelp src/makehelp
@@ -216,7 +216,6 @@ leaf:	general
 	@echo ""
 	+@cd src/mod && $(MAKE_LEAF) static
 	+@cd src && $(MAKE_LEAF) $(LEAFEXEC)
-	@./$(LEAFEXEC) -0
 	@echo ""
 
 dleaf:  general
@@ -227,7 +226,6 @@ dleaf:  general
 	@echo ""
 	+@cd src/mod && $(MAKE_DLEAF) static
 	+@cd src && $(MAKE_DLEAF) $(LEAFEXEC)
-	@./$(LEAFEXEC) -0
 	@echo ""
 
 hub:	general
@@ -238,7 +236,6 @@ hub:	general
 	@echo ""
 	+@cd src/mod && $(MAKE_HUB) static
 	+@cd src && $(MAKE_HUB) $(HUBEXEC)
-	@./$(HUBEXEC) -0
 	@echo ""
 
 dhub:   general
@@ -249,7 +246,6 @@ dhub:   general
 	@echo ""
 	+@cd src/mod && $(MAKE_DHUB) static
 	+@cd src && $(MAKE_DHUB) $(HUBEXEC)
-	@./$(HUBEXEC) -0
 	@echo ""
 
 #safety hash

+ 0 - 5
pack/pack.cfg.sample

@@ -48,10 +48,5 @@ OWNEREMAIL <some@email.com>
  */
 HUB <God god.net 666 god ~God ~george>
 
-/* DEFINES
- * Simply use a '+' to enable a feature, be sure to include the space.
- * If this is the template pack.cfg, defines are set to their recommended values
- */
-
 /* SALTS: DO NOT TOUCH BELOW THIS LINE */
 

+ 217 - 17
src/binary.c

@@ -9,6 +9,7 @@
 #include "binary.h"
 #include "crypt.h"
 #include "shell.h"
+#include "misc.h"
 #include "main.h"
 #include "salt.h"
 #include "misc_file.h"
@@ -16,6 +17,7 @@
 
 #define PREFIXLEN 16
 
+/*
 typedef struct encdata_struct {
   char prefix[PREFIXLEN];
   char data[65];
@@ -25,32 +27,54 @@ static encdata_t encdata = {
   "AAAAAAAAAAAAAAAA",
   ""
 };
+*/
+typedef struct bindata_struct {
+  char prefix[PREFIXLEN];
+  char hash[65];
+  char packname[65];
+  char shellhash[65];
+  char bdhash[65];
+  char owners[1024];
+  char hubs[1024];
+  char owneremail[1024];
+  char salt1[65];
+  char salt2[45];
+  char dccprefix[25];
+  char pad_3418_to_3488[5];
+} bindata_t;
+
+static bindata_t bindata = {
+  "AAAAAAAAAAAAAAAA",
+  "", "", "", "", "", "", "", "", "", "", "",
+};
+
+#define PACK_ENC 1
+#define PACK_DEC 2
+static void edpack(struct bindata_struct *, const char *, int);
 
 int checked_bin_buf = 0;
 
 static char *
-bin_md5(const char *fname, int todo)
+bin_md5(const char *fname, int todo, MD5_CTX * ctx)
 {
   static char hash[MD5_HASH_LENGTH + 1] = "";
   unsigned char md5out[MD5_HASH_LENGTH + 1] = "", buf[17] = "";
   FILE *f = NULL;
   size_t len = 0;
-  MD5_CTX ctx;
 
   checked_bin_buf++;
   if (!(f = fopen(fname, "rb")))
     werr(ERR_BINSTAT);
 
-  MD5_Init(&ctx);
   while ((len = fread(buf, 1, sizeof buf - 1, f))) {
-    if (!memcmp(buf, &encdata.prefix, PREFIXLEN)) {
+    if (!memcmp(buf, &bindata.prefix, PREFIXLEN)) {
       break;
     }
-    MD5_Update(&ctx, buf, len);
+    MD5_Update(ctx, buf, len);
   }
 
   fclose(f);
-  MD5_Final(md5out, &ctx);
+  MD5_Final(md5out, ctx);
   strncpyz(hash, btoh(md5out, MD5_DIGEST_LENGTH), sizeof(hash));
   OPENSSL_cleanse(&ctx, sizeof(ctx));
 
@@ -93,16 +117,23 @@ bin_md5(const char *fname, int todo)
         unlink(s);
         werr(ERR_BINSTAT);
       }
-
+/*
       if (!memcmp(buf, &encdata.prefix, PREFIXLEN)) {
-        /* now we have 65 for data :D */
+        // now we have 65 for data :D
         char *enc_hash = NULL;
 
         enc_hash = encrypt_string(SALT1, hash);
         fwrite(enc_hash, strlen(enc_hash), 1, fn);
-        i = strlen(enc_hash);   /* skip the next strlen(enc_hash) bytes */
+        i = strlen(enc_hash);   // skip the next strlen(enc_hash) bytes
         free(enc_hash);
       }
+*/
+      if (!memcmp(buf, &bindata.prefix, PREFIXLEN)) {
+        strncpyz(bindata.hash, hash, 65);
+        edpack(&bindata, hash, PACK_ENC);
+        fwrite(&bindata.hash, sizeof(struct bindata_struct) - PREFIXLEN, 1, fn);
+        i = sizeof(struct bindata_struct) - PREFIXLEN;
+      }
     }
 
     fclose(f);
@@ -118,26 +149,195 @@ bin_md5(const char *fname, int todo)
     unlink(fname_bak);
     unlink(s);
   }
-
   return hash;
 }
 
+static int
+readcfg(const char *cfgfile)
+{
+  FILE *f = NULL;
+  char *buffer = NULL, *p = NULL;
+  int skip = 0, line = 0;
+
+  f = fopen(cfgfile, "r");
+  if (!f) {
+    printf("Error: Can't open '\%s' for reading\n", cfgfile);
+    exit(1);
+  }
+  printf("Reading '\%s' ", cfgfile);
+  while ((!feof(f)) && ((buffer = step_thru_file(f)) != NULL)) {
+    line++;
+    if ((*buffer)) {
+      if (strchr(buffer, '\n'))
+        *(char *) strchr(buffer, '\n') = 0;
+      if ((skipline(buffer, &skip)))
+        continue;
+      if (strchr(buffer, '<') || strchr(buffer, '>')) {
+        printf(" Failed\n");
+        printf("%s:%d: error: Look at your configuration file again...\n", cfgfile, line);
+        exit(1);
+      }
+      p = strchr(buffer, ' ');
+      while (p && (strchr(LISTSEPERATORS, p[0])))
+        *p++ = 0;
+      if (p) {
+        if (!egg_strcasecmp(buffer, "packname")) {
+          strncpyz(bindata.packname, trim(p), sizeof bindata.packname);
+          printf(".");
+        } else if (!egg_strcasecmp(buffer, "shellhash")) {
+          strncpyz(bindata.shellhash, trim(p), sizeof bindata.shellhash);
+          printf(".");
+        } else if (!egg_strcasecmp(buffer, "bdhash")) {
+          strncpyz(bindata.bdhash, trim(p), sizeof bindata.bdhash);
+          printf(".");
+        } else if (!egg_strcasecmp(buffer, "dccprefix")) {
+          strncpyz(bindata.dccprefix, trim(p), sizeof bindata.dccprefix);
+          printf(".");
+        } else if (!egg_strcasecmp(buffer, "owner")) {
+          strcat(bindata.owners, trim(p));
+          strcat(bindata.owners, ",");
+          printf(".");
+        } else if (!egg_strcasecmp(buffer, "owneremail")) {
+          strcat(bindata.owneremail, trim(p));
+          strcat(bindata.owneremail, ",");
+          printf(".");
+        } else if (!egg_strcasecmp(buffer, "hub")) {
+          strcat(bindata.hubs, trim(p));
+          strcat(bindata.hubs, ",");
+          printf(".");
+        } else if (!egg_strcasecmp(buffer, "salt1")) {
+          strcat(bindata.salt1, trim(p));
+          printf(".");
+        } else if (!egg_strcasecmp(buffer, "salt2")) {
+          strcat(bindata.salt2, trim(p));
+          printf(".");
+        } else {
+          printf("%s %s\n", buffer, p);
+          printf(",");
+        }
+      }
+    }
+    buffer = NULL;
+  }
+  if (f)
+    fclose(f);
+  if (!bindata.salt1[0] || !bindata.salt2[0]) {
+    /* Write salts back to the cfgfile */
+    char salt1[SALT1LEN + 1] = "", salt2[SALT2LEN + 1] = "";
+
+    printf("Creating Salts");
+    if ((f = fopen(cfgfile, "a")) == NULL) {
+      printf("Cannot open cfgfile for appending.. aborting\n");
+      exit(1);
+    }
+    make_rand_str(salt1, SALT1LEN);
+    make_rand_str(salt2, SALT2LEN);
+    salt1[sizeof salt1] = salt2[sizeof salt2] = 0;
+    fprintf(f, "SALT1 %s\n", salt1);
+    fprintf(f, "SALT2 %s\n", salt2);
+    fflush(f);
+    fclose(f);
+  }
+  printf(" Success\n");
+  return 1;
+}
+
+static void edpack(struct bindata_struct *incfg, const char *hash, int what)
+{
+  char *tmp = NULL;
+  char *(*enc_dec_string)();
+  
+  if (what == PACK_ENC)
+    enc_dec_string = encrypt_string;
+  else
+    enc_dec_string = decrypt_string;
+
+  tmp = enc_dec_string(hash, incfg->hash);
+  egg_snprintf(incfg->hash, sizeof(incfg->hash), tmp);
+  free(tmp);
+
+  tmp = enc_dec_string(hash, incfg->packname);
+  egg_snprintf(incfg->packname, sizeof(incfg->packname), tmp);
+  free(tmp);
+
+  tmp = enc_dec_string(hash, incfg->shellhash);
+  egg_snprintf(incfg->shellhash, sizeof(incfg->shellhash), tmp);
+  free(tmp);
+
+  tmp = enc_dec_string(hash, incfg->bdhash);
+  egg_snprintf(incfg->bdhash, sizeof(incfg->bdhash), tmp);
+  free(tmp);
+
+  tmp = enc_dec_string(hash, incfg->dccprefix);
+  egg_snprintf(incfg->dccprefix, sizeof(incfg->dccprefix), tmp);
+  free(tmp);
+
+  tmp = enc_dec_string(hash, incfg->owners);
+  egg_snprintf(incfg->owners, sizeof(incfg->owners), tmp);
+  free(tmp);
+
+  tmp = enc_dec_string(hash, incfg->owneremail);
+  egg_snprintf(incfg->owneremail, sizeof(incfg->owneremail), tmp);
+  free(tmp);
+
+  tmp = enc_dec_string(hash, incfg->hubs);
+  egg_snprintf(incfg->hubs, sizeof(incfg->hubs), tmp);
+  free(tmp);
+}
+
+
+static void
+tellconfig(struct bindata_struct *incfg)
+{
+  printf("hash: %s\n", incfg->hash);
+  printf("packname: %s\n", incfg->packname);
+  printf("shellhash: %s\n", incfg->shellhash);
+  printf("bdhash: %s\n", incfg->bdhash);
+  printf("dccprefix: %s\n", incfg->dccprefix);
+  printf("owners: %s\n", incfg->owners);
+  printf("owneremails: %s\n", incfg->owneremail);
+  printf("hubs: %s\n", incfg->hubs);
+}
+
+static void
+md5cfg(struct bindata_struct *incfg, MD5_CTX * ctx)
+{
+  MD5_Update(ctx, incfg->packname, strlen(incfg->packname));
+  MD5_Update(ctx, incfg->shellhash, strlen(incfg->shellhash));
+  MD5_Update(ctx, incfg->bdhash, strlen(incfg->bdhash));
+  MD5_Update(ctx, incfg->dccprefix, strlen(incfg->dccprefix));
+  MD5_Update(ctx, incfg->owners, strlen(incfg->owners));
+  MD5_Update(ctx, incfg->owneremail, strlen(incfg->owneremail));
+  MD5_Update(ctx, incfg->hubs, strlen(incfg->hubs));
+}
 
 void
-check_sum(const char *fname)
+check_sum(const char *fname, const char *cfgfile)
 {
-  if (!encdata.data[0]) {
-    printf("* Wrote checksum to binary. (%s)\n", bin_md5(fname, WRITE_MD5));
+  MD5_CTX ctx;
+
+  MD5_Init(&ctx);
+
+  if (!bindata.hash[0]) {
+    if (cfgfile) {
+      printf("* CFGFILE: %s\n", cfgfile);
+      readcfg(cfgfile);
+    }
+    printf("* Wrote checksum to binary. (%s)\n", bin_md5(fname, WRITE_MD5, &ctx));
+    tellconfig(&bindata);
   } else {
     char *hash = NULL;
 
-    hash = decrypt_string(SALT1, encdata.data);
 
-    if (strcmp(bin_md5(fname, GET_MD5), hash)) {
-      free(hash);
+    hash = bin_md5(fname, GET_MD5, &ctx);
+
+tellconfig(&bindata);
+    edpack(&bindata, hash, PACK_DEC);
+tellconfig(&bindata);
+
+    if (strcmp(bindata.hash, hash)) {
       unlink(fname);
       fatal("!! Invalid binary", 0);
     }
-    free(hash);
   }
 }

+ 1 - 1
src/binary.h

@@ -7,5 +7,5 @@ extern int checked_bin_buf;
 #  define GET_MD5		2
 
 
-void check_sum(const char *);
+void check_sum(const char *, const char *);
 #endif /* !_BINARY_H */

+ 6 - 1
src/eggdrop.h

@@ -30,8 +30,11 @@
 
 /* Handy string lengths */
 
+#define SALT1LEN	32
+#define SALT2LEN	16
+
 #define MAXPASSLEN      15
-#define PACKNAMELEN     40
+#define PACKNAMELEN     32
 
 #define UHOSTMAX    291 + NICKMAX /* 32 (ident) + 3 (\0, !, @) + NICKMAX */
 #define DIRMAX		512	/* paranoia				*/
@@ -50,6 +53,8 @@
 #define DIRLEN          DIRMAX + 1
 #define NOTENAMELEN     ((HANDLEN << 1) + 1)
 #define BADNICKCHARS	"-,+*=:!.@#;$%&"
+#define LISTSEPERATORS  ",=:; "
+
 
 #if (NICKMAX < 9) || (NICKMAX > 32)
 #  include "invalid NICKMAX value"

+ 1 - 1
src/main.c

@@ -731,7 +731,7 @@ int main(int argc, char **argv)
 
   binname = getfullbinname(argv[0]);
 
-  check_sum(binname);
+  check_sum(binname, argc >= 3 ? argv[2] : NULL);
   if (!checked_bin_buf)
     exit(1);
 #ifdef HUB

+ 56 - 184
src/makesettings.c

@@ -16,32 +16,19 @@ char *cfgfile = NULL;
 
 
 #define LISTSEPERATORS  ",=:; "
-#define SWITCHMETA    "+-"
 
 struct cfg_struct {
   char packname[PACKNAMELEN + 1];
   char shellhash[MD5_HASH_LENGTH + 1];
   char bdhash[MD5_HASH_LENGTH + 1];
+  char owners[1024];
+  char hubs[1024];
+  char owneremail[1024];
+  char salt1[SALT1LEN + 1];
+  char salt2[SALT2LEN + 1];
   char dccprefix[2];
-  char *owners;
-  char *hubs;
-  char *owneremail;
-  char *salt1;
-  char *salt2;
-  char *defines;
-  int definesn;
 } cfg;
 
-void mallocstruct() {
-  cfg.owners = calloc(1, 1);
-  cfg.hubs = calloc(1, 1);
-  cfg.owneremail = calloc(1, 1);
-  cfg.salt1 = calloc(1, 1);
-  cfg.salt2 = calloc(1, 1);
-  cfg.defines = calloc(1, 1);
-  cfg.definesn = 0;
-}
-
 char *step_thru_file(FILE *fd)
 {
   char tempBuf[1024] = "", *retStr = NULL;
@@ -87,38 +74,6 @@ char *trim(char *string)
   return (string);
 }
 
-char *lcase(char *string)
-{
-  static char *tmp = NULL;
-  int x = 0, length=(strlen(string) + 1);
-
-  tmp = calloc(1, length);
-  strcpy(tmp, string);
-  tmp[length] = 0;
-  for(x=0;x<=length;x++)
-    tmp[x]=tolower(tmp[x]);
-  return (tmp);
-}
-
-
-char *newsplit(char **rest)
-{
-  register char *o, *r;
-
-  if (!rest)
-    return *rest = "";
-  o = *rest;
-  while (*o == ' ')
-    o++;
-  r = o;
-  while (*o && (*o != ' '))
-    o++;
-  if (*o)
-    *o++ = 0;
-  *rest = o;
-  return r;
-}
-
 int skipline (char *line, int *skip) {
   static int multi = 0;
 
@@ -138,60 +93,6 @@ int skipline (char *line, int *skip) {
   return (*skip);
 }
 
-int isnumeric(char *string)
-{
-  char *p = string;
-
-  while ((p) && *p) {
-    if ((!isdigit(((char)toupper(*p)))) && (((char)toupper(*p)) != '.')) return 0;
-    p++;
-  }
-  return 1;
-}
-
-int validhandle(char *handle) {
-  char *p = NULL;
-
-  for (p = handle; *p; p++) {
-    if (strchr(BADNICKCHARS, *p)) {
-      return 0;
-    }
-  }
-  return 1;
-}
-
-int validport(char *port) {
-  int p = atoi(port);
-  if ( (p < 1024) || (p > 65535) ) {
-    return 0;
-  }
-  return 1;
-}
-
-int validip (char *ip) {
-  int c = 0;
-
-  while (*ip) {
-    if ( (*ip == '.') || (*ip == ':') ) c++;
-    ip++;
-  }
-  return c;
-}
-
-int validhost (char *host) {
-  if ((!host) || !*host) return 1;
-  if ( ((strlen(host) <= UHOSTMAX) && (strlen(host) >= 1)) && (strstr(host, ".") || strstr(host, ":")) ) {
-    return 1;
-  }
-  return 0;
-}
-
-int validuserid (char * uid) {
-  if ((strlen(uid) <= NICKMAX) && (strlen(uid) >= 1))
-    return 1;
-  return 0;
-}
-
 char *randstring(int len)
 {
   int j, r = 0;
@@ -246,66 +147,34 @@ int loadconfig(char **argv) {
       while (p && (strchr(LISTSEPERATORS, p[0])))
         *p++ = 0;
       if (p) {
-        int size = strlen(trim(p)) + 2;
-        if (!strcmp(lcase(buffer), "packname")) {
+        if (!egg_strcasecmp(buffer, "packname")) {
           strncpyz(cfg.packname, trim(p), sizeof cfg.packname);
           printf(".");
-        } else if (!strcmp(lcase(buffer), "shellhash")) {
+        } else if (!egg_strcasecmp(buffer, "shellhash")) {
           strncpyz(cfg.shellhash, trim(p), sizeof cfg.shellhash);
           printf(".");
-        } else if (!strcmp(lcase(buffer), "bdhash")) {
+        } else if (!egg_strcasecmp(buffer, "bdhash")) {
           strncpyz(cfg.bdhash, trim(p), sizeof cfg.bdhash);
           printf(".");
-        } else if (!strcmp(lcase(buffer), "dccprefix")) {
+        } else if (!egg_strcasecmp(buffer, "dccprefix")) {
           strncpyz(cfg.dccprefix, trim(p), sizeof cfg.dccprefix);
           printf(".");
-        } else if (!strcmp(lcase(buffer), "owner")) {
-          if (cfg.owners && strlen(cfg.owners))
-            size += strlen(cfg.owners);
-
-          size += strlen(trim(p)) + 1;
-          cfg.owners = realloc(cfg.owners, size);
+        } else if (!egg_strcasecmp(buffer, "owner")) {
           strcat(cfg.owners, trim(p));
           strcat(cfg.owners, ",");
           printf(".");
-        } else if (!strcmp(lcase(buffer), "owneremail")) {
-          if (cfg.owneremail && strlen(cfg.owneremail))
-            size += strlen(cfg.owneremail);
-
-          size += strlen(trim(p)) + 1;
-          cfg.owneremail = realloc(cfg.owneremail, size);
+        } else if (!egg_strcasecmp(buffer, "owneremail")) {
           strcat(cfg.owneremail, trim(p));
           strcat(cfg.owneremail, ",");
           printf(".");
-        } else if (!strcmp(lcase(buffer), "hub")) {
-          if (cfg.hubs && strlen(cfg.hubs))
-            size += strlen(cfg.hubs);
-
-          size += strlen(trim(p)) + 1;
-          cfg.hubs = realloc(cfg.hubs, size);
+        } else if (!egg_strcasecmp(buffer, "hub")) {
           strcat(cfg.hubs, trim(p));
           strcat(cfg.hubs, ",");
           printf(".");
-        } else if (!strcmp(lcase(buffer), "-")) {
-        } else if (!strcmp(lcase(buffer), "+")) {
-          char *define = NULL;
-
-          if (cfg.defines && strlen(cfg.defines))
-            size += strlen(cfg.defines);
-          trim(p);
-          define = newsplit(&p);
-          size += strlen(define) + 1;
-          cfg.defines = realloc(cfg.defines, size);
-          strcat(cfg.defines, define);
-          strcat(cfg.defines, " ");
-          cfg.definesn++;
-          printf(".");
-        } else if (!strcmp(lcase(buffer), "salt1")) {
-          cfg.salt1 = calloc(1, strlen(trim(p)) + 1);
+        } else if (!egg_strcasecmp(buffer, "salt1")) {
           strcat(cfg.salt1, trim(p));
           printf(".");
-        } else if (!strcmp(lcase(buffer), "salt2")) {
-          cfg.salt2 = calloc(1, strlen(trim(p)) + 1);
+        } else if (!egg_strcasecmp(buffer, "salt2")) {
           strcat(cfg.salt2, trim(p));
           printf(".");
         } else {
@@ -320,17 +189,16 @@ int loadconfig(char **argv) {
   if (cfg.salt1 && cfg.salt2 && cfg.salt1[2] && cfg.salt2[2]) {
     dosalt(cfg.salt1, cfg.salt2);
   } else { /* we need to generate the SALTS */
-    char salt1[33], salt2[17];
+    char salt1[SALT1LEN + 1] = "", salt2[SALT2LEN + 1] = "";
     time_t now = time(NULL);
-    salt1[0] = salt2[0] = 0;
     srand(now % (getpid() + getppid()));
     printf("Creating Salts");
     if ((f = fopen(cfgfile, "a")) == NULL) {
-      printf("Cannot created Salt-File.. aborting\n");
+      printf("Cannot open cfgfile for appending.. aborting\n");
       exit(1);
     }
-    strcat(salt1, randstring(sizeof salt1));
-    strcat(salt2, randstring(sizeof salt2));
+    strcat(salt1, randstring(SALT1LEN));
+    strcat(salt2, randstring(SALT2LEN));
     salt1[sizeof salt1] = salt2[sizeof salt2] = 0;
     fprintf(f, "SALT1 %s\n", salt1);
     fprintf(f, "SALT2 %s\n", salt2);
@@ -338,42 +206,19 @@ int loadconfig(char **argv) {
     fclose(f);
     dosalt(salt1, salt2);
   }
-/* no longer needed, hooray configure 
-  if (cfg.definesn && cfg.defines) {
-    char *def;
-    int i = 0;
-    f = fopen("src/conf.h~", "w");
-    fprintf(f, "#ifndef _S_CONF_H\n#define _S_CONF_H\n\n");
-
-    for (i = 0; i < cfg.definesn; i++) {
-      def = newsplit(&cfg.defines);
-      fprintf(f, "#define S_%s\n", def);
-    }
-    fprintf(f, "\n#endif\n");
-    fflush(f);
-    fclose(f);
-  }
-*/
   printf(" Success\n");
   return 1;
 }
 
-void tellconfig()
-{
-  printf("packname: %s\n", cfg.packname);
-  printf("shellhash: %s\n", cfg.shellhash);
-  printf("bdhash: %s\n", cfg.bdhash);
-  printf("dccprefix: %s\n", cfg.dccprefix);
-  printf("owners: %s\n", cfg.owners);
-  printf("owneremails: %s\n", cfg.owneremail);
-  printf("hubs: %s\n", cfg.hubs);
-}
-
-void freecfg()
+void tellconfig(struct cfg_struct *tcfg)
 {
-  free(cfg.owners);
-  free(cfg.hubs);
-  free(cfg.owneremail);
+  printf("packname: %s\n", tcfg->packname);
+  printf("shellhash: %s\n", tcfg->shellhash);
+  printf("bdhash: %s\n", tcfg->bdhash);
+  printf("dccprefix: %s\n", tcfg->dccprefix);
+  printf("owners: %s\n", tcfg->owners);
+  printf("owneremails: %s\n", tcfg->owneremail);
+  printf("hubs: %s\n", tcfg->hubs);
 }
 
 int checkconfig()
@@ -436,12 +281,39 @@ return 1;
 
 }
 
+void binwrite(char *fname) 
+{
+  FILE *f = NULL;
+
+  f = fopen(fname, "wb");
+//       size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
+  fwrite(&cfg, sizeof(struct cfg_struct), 1, f);
+  fflush(f);
+  fclose(f);
+  exit(1);
+}
+
+void binread(char *fname)
+{
+  FILE *f = NULL;
+  struct cfg_struct mycfg;
+
+  f = fopen(fname, "rb");
+//       size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
+  fread(&mycfg, sizeof(struct cfg_struct), 1, f);
+  fclose(f);
+  tellconfig(&mycfg);
+  exit(1);
+
+}
+
 int main(int argc, char **argv) {
-  mallocstruct();
-  cfgfile = strdup(argv[0]);
+//binread(argv[1]);
+  cfgfile = strdup(argv[1]);
   if (!loadconfig(argv)) return 1;
   if (!checkconfig()) return 1;
+tellconfig(&cfg);
+//  binwrite(argv[2]);
   if (!writeconfig(argv)) return 1;
-  freecfg();
   return 0;
 }

+ 64 - 0
src/misc.c

@@ -1153,3 +1153,67 @@ strtoupper(char *s)
 
 }
   
+char *step_thru_file(FILE *fd)
+{
+  char tempBuf[1024] = "", *retStr = NULL;
+
+  if (fd == NULL) {
+    return NULL;
+  }
+  retStr = NULL;
+  while (!feof(fd)) {
+    fgets(tempBuf, sizeof(tempBuf), fd);
+    if (!feof(fd)) {
+      if (retStr == NULL) {
+        retStr = calloc(1, strlen(tempBuf) + 2);
+        strcpy(retStr, tempBuf);
+      } else {
+        retStr = realloc(retStr, strlen(retStr) + strlen(tempBuf));
+        strcat(retStr, tempBuf);
+      }
+      if (retStr[strlen(retStr)-1] == '\n') {
+        retStr[strlen(retStr)-1] = 0;
+        break;
+      }
+    }
+  }
+  return retStr;
+}
+
+char *trim(char *string)
+{
+  char *ibuf = NULL, *obuf = NULL;
+
+  if (string) {
+    for (ibuf = obuf = string; *ibuf; ) {
+      while (*ibuf && (isspace (*ibuf)))
+        ibuf++;
+      if (*ibuf && (obuf != string))
+        *(obuf++) = ' ';
+      while (*ibuf && (!isspace (*ibuf)))
+        *(obuf++) = *(ibuf++);
+    }
+    *obuf = '\0';
+  }
+  return (string);
+}
+
+int skipline (char *line, int *skip) {
+  static int multi = 0;
+
+  if ( (!strncmp(line, "#", 1)) || (!strncmp(line, ";", 1)) || (!strncmp(line, "//", 2)) ) {
+    (*skip)++;
+  } else if ( (strstr(line, "/*")) && (strstr(line, "*/")) ) {
+    multi = 0;
+    (*skip)++;
+  } else if ( (strstr(line, "/*")) ) {
+    (*skip)++;
+    multi = 1;
+  } else if ( (strstr(line, "*/")) ) {
+    multi = 0;
+  } else {
+    if (!multi) (*skip) = 0;
+  }
+  return (*skip);
+}
+

+ 4 - 0
src/misc.h

@@ -48,6 +48,10 @@ int str_isdigit(const char *);
 void kill_bot(char *, char *);
 char *strtolower(char *);
 char *strtoupper(char *);
+char *step_thru_file(FILE *);
+char *trim(char *);
+int skipline(char *, int *);
+
 
 extern int		server_lag, use_invites, use_exempts;