Index: ../ircu2.10.06/todo.jcea =================================================================== RCS file: /cvsroot/ircd/todo.jcea,v retrieving revision 1.23 retrieving revision 1.24 diff -c -r1.23 -r1.24 *** ../ircu2.10.06/todo.jcea 1999/10/27 11:05:38 1.23 --- ../ircu2.10.06/todo.jcea 1999/10/27 14:42:12 1.24 *************** *** 1,4 **** --- 1,33 ---- 27/Oct/99 + Cuando un mismo registro tiene varios destinatarios, + en cada servidor se almacena en memoria solo el mas + reciente cuya mascara sea valida para ese servidor. + + Deberia almacenarse el que tenga la mascara + mas especifica. El problema es programar esto. + + Lo sencillo seria que mascaras mas especificas + sencillamente son mas largas, pero eso no vale + para "*.irc-hispano.org". + + Otra posibilidad es simplemente contar el numero + de caracteres que "absorbe" cada comodin. A mas + absorcion, menos especifico. Pero esto es equivalente + a lo anterior. + + Si forzamos a que la parte "irc-hispano.org" sea siempre + sustituida por un "*", se puede usar una metrica de + este tipo. + + De todas formas, es cierto que "*.org" es mas especifico + que "*". + + 27/Oct/99 + Cuando el destinatario es "*", no deberia almacenarse + la mascara en memoria, ya que es el caso mas habitual y + asi ahorramos memoria. + + 27/Oct/99 Conservar en memoria exclusivamente un indice a la posicion en la BDD en disco. La BDD se mapea en memoria con un mmap. Index: ../ircu2.10.06/ircd/s_bdd.c =================================================================== RCS file: /cvsroot/ircd/ircd/s_bdd.c,v retrieving revision 1.11 retrieving revision 1.12 diff -c -r1.11 -r1.12 *** ../ircu2.10.06/ircd/s_bdd.c 1999/10/27 12:38:36 1.11 --- ../ircu2.10.06/ircd/s_bdd.c 1999/10/27 14:42:12 1.12 *************** *** 794,800 **** } /* ! * initdb * * Lee la base de datos de disco * --- 794,800 ---- } /* ! * initdb2 * * Lee la base de datos de disco * *************** *** 807,812 **** --- 807,813 ---- int db_file; Dlink *lp; struct tabla_en_memoria mapeo; + char *destino, *p, *p2; borrar_db(que_bdd); *************** *** 815,945 **** do { /* db_alta modifica la cadena */ ! if (tabla_residente[que_bdd] && !((*buf == '*') && (*(buf + 1) == '\0'))) { ! db_alta(buf, que_bdd, 0); ! } ! else ! { ! /* ! ** Necesitamos coger su numero de serie ! ** para poder determinar si los ! ** registros que nos lleguen por la red ! ** hay que guardarlos en disco, ademas ! ** de poder negociar convenientemente ! ** las versiones de las BDD ! ** en un NetJoin. ! */ ! tabla_serie[que_bdd] = atol(buf); ! actualiza_hash(buf, que_bdd); } ! } ! while (leer_db(&mapeo, buf) != -1); ! cerrar_db(&mapeo); ! /* ** Ahora comprueba que el HASH de la BDD ** cargada se corresponda con el HASH almacenado */ ! lee_hash(que_bdd, &hi, &lo); ! if ((tabla_hash_hi[que_bdd] != hi) || (tabla_hash_lo[que_bdd] != lo)) ! { ! sendto_ops("ATENCION - Base de Datos " "'%c' aparentemente corrupta. Borrando...", que_bdd); ! borrar_db(que_bdd); ! sprintf_irc(path, "%s/tabla.%c", DBPATH, que_bdd); ! alarm(3); ! db_file = open(path, O_TRUNC, S_IRUSR | S_IWUSR); ! close(db_file); ! if (db_file == -1) ! db_die("Error al intentar truncar (open)", que_bdd); ! alarm(0); ! /* ** Solucion temporal ** Corta conexiones con los HUBs */ ! for (lp = me.serv->down; lp; lp = lp->next) ! { ! if (find_conf_host(lp->value.cptr->confs, lp->value.cptr->name, CONF_HUB) != NULL) ! { ! sprintf_irc(buf, "BDD '%c' inconsistente. Resincronizando...", que_bdd); ! exit_client(lp->value.cptr, lp->value.cptr, &me, buf); ! } ! } /* ** Fin solucion temporal */ ! corta_si_multiples_hubs(NULL, que_bdd, "inconsistente"); ! ! sendto_ops("Solicitando actualizacion BDD '%c' " "a los nodos vecinos.", que_bdd); - /* ** Solo pide a los HUBs, porque no se ** aceptan datos de leafs. */ ! for (lp = me.serv->down; lp; lp = lp->next) ! { ! if (find_conf_host(lp->value.cptr->confs, lp->value.cptr->name, CONF_HUB) != NULL) ! { ! sendto_one(lp->value.cptr, "%s DB %s 0 J %lu %c", ! NumServ(&me), lp->value.cptr->name, tabla_serie[que_bdd], que_bdd); } ! } ! } ! almacena_hash(que_bdd); ! } ! ! void initdb(void) ! { ! char c; ! memset(tabla_residente, 0, sizeof(tabla_residente)); ! ! tabla_residente[ESNET_NICKDB] = 1; ! #if defined(DB_ESNET) && defined(ESNET_CLONES) ! tabla_residente[ESNET_CLONESDB] = 1; #endif - tabla_residente[BDD_OPERDB] = 1; - tabla_residente[BDD_CHANDB] = 1; - tabla_residente[BDD_BOTSDB] = 1; - tabla_residente[BDD_VIRTUALDB] = 1; - tabla_residente[BDD_MIGRACION] = 1; - - for (c = ESNET_BDD; c <= ESNET_BDD_END; c++) - initdb2(c); - } - /* * reload_db * * Recarga la base de datos de disco, liberando la memoria * */ ! void reload_db(void) ! { ! char buf[16]; ! char c; ! ! sendto_ops("Releyendo Bases de Datos..."); ! initdb(); ! for (c = ESNET_BDD; c <= ESNET_BDD_END; c++) ! { ! if (tabla_serie[c]) ! { ! inttobase64(buf, tabla_hash_hi[c], 6); ! inttobase64(buf + 6, tabla_hash_lo[c], 6); ! sendto_ops("DB: '%c'. Ultimo registro: %lu. HASH: %s", ! c, tabla_serie[c], buf); ! } ! } ! } /* --- 816,947 ---- do { /* db_alta modifica la cadena */ ! destino = NULL; ! if (tabla_residente[que_bdd]) { ! destino = strchr(buf, ' ') + 1; ! p2 = strchr(strchr(destino, ' ') + 1, ' ') + 1; ! if ((*destino == '*') && (*(destino + 1) == ' ')) ! { ! /* ! ** Este caso es tan normal ! ** que lo optimizamos. ! */ ! destino = NULL; ! } ! else ! { ! p = RunMalloc(strlen(destino)); ! strcpy(p, destino); ! *strchr(p, ' ') = '\0'; ! collapse(p); ! if (!match(p, me.name)) ! destino = NULL; /* Para nosotros */ ! RunFree(p); ! } } ! if (tabla_residente[que_bdd] && (destino == NULL) && !((*p2 == '*') ! && (*(p2 + 1) == '\0'))) ! { ! db_alta(buf, que_bdd, 0);} ! else ! { ! /* ! ** Necesitamos coger su numero de serie ! ** para poder determinar si los ! ** registros que nos lleguen por la red ! ** hay que guardarlos en disco, ademas ! ** de poder negociar convenientemente ! ** las versiones de las BDD ! ** en un NetJoin. ! */ ! tabla_serie[que_bdd] = atol(buf); actualiza_hash(buf, que_bdd);} ! } ! while (leer_db(&mapeo, buf) != -1); cerrar_db(&mapeo); /* ** Ahora comprueba que el HASH de la BDD ** cargada se corresponda con el HASH almacenado */ ! lee_hash(que_bdd, &hi, &lo); ! if ((tabla_hash_hi[que_bdd] != hi) || (tabla_hash_lo[que_bdd] != lo)) ! { ! sendto_ops("ATENCION - Base de Datos " "'%c' aparentemente corrupta. Borrando...", que_bdd); ! borrar_db(que_bdd); ! sprintf_irc(path, "%s/tabla.%c", DBPATH, que_bdd); ! alarm(3); ! db_file = open(path, O_TRUNC, S_IRUSR | S_IWUSR); ! close(db_file); ! if (db_file == -1) ! db_die("Error al intentar truncar (open)", que_bdd); alarm(0); /* ** Solucion temporal ** Corta conexiones con los HUBs */ ! for (lp = me.serv->down; lp; lp = lp->next) ! { ! if (find_conf_host(lp->value.cptr->confs, lp->value.cptr->name, CONF_HUB) != NULL) ! { ! sprintf_irc(buf, "BDD '%c' inconsistente. Resincronizando...", ! que_bdd); exit_client(lp->value.cptr, lp->value.cptr, &me, buf);} ! } /* ** Fin solucion temporal */ ! corta_si_multiples_hubs(NULL, que_bdd, "inconsistente"); ! sendto_ops("Solicitando actualizacion BDD '%c' " "a los nodos vecinos.", que_bdd); /* ** Solo pide a los HUBs, porque no se ** aceptan datos de leafs. */ ! for (lp = me.serv->down; lp; lp = lp->next) ! { ! if (find_conf_host(lp->value.cptr->confs, lp->value.cptr->name, CONF_HUB) != NULL) ! { ! sendto_one(lp->value.cptr, "%s DB %s 0 J %lu %c", ! NumServ(&me), lp->value.cptr->name, tabla_serie[que_bdd], que_bdd);} ! } } ! almacena_hash(que_bdd);} ! void initdb(void) { ! char c; ! memset(tabla_residente, 0, sizeof(tabla_residente)); ! tabla_residente[ESNET_NICKDB] = 1; #if defined(DB_ESNET) && defined(ESNET_CLONES) ! tabla_residente[ESNET_CLONESDB] = 1; #endif + tabla_residente[BDD_OPERDB] = 1; + tabla_residente[BDD_CHANDB] = 1; + tabla_residente[BDD_BOTSDB] = 1; + tabla_residente[BDD_VIRTUALDB] = 1; + tabla_residente[BDD_MIGRACION] = 1; + for (c = ESNET_BDD; c <= ESNET_BDD_END; c++) initdb2(c);} /* * reload_db * * Recarga la base de datos de disco, liberando la memoria * */ ! void reload_db(void) { ! char buf[16]; ! char c; ! sendto_ops("Releyendo Bases de Datos..."); ! initdb(); for (c = ESNET_BDD; c <= ESNET_BDD_END; c++) ! { ! if (tabla_serie[c]) ! { ! inttobase64(buf, tabla_hash_hi[c], 6); ! inttobase64(buf + 6, tabla_hash_lo[c], 6); ! sendto_ops("DB: '%c'. Ultimo registro: %lu. HASH: %s", ! c, tabla_serie[c], buf);} ! } ! } /* *************** *** 949,1012 **** * 29/May/98 jcea@argo.es * */ ! int m_db(aClient *cptr, aClient *sptr, int parc, char *parv[]) ! { ! unsigned long db; ! aClient *acptr; ! Dlink *lp; ! char db_buf[1024], db_buf2[1024]; ! char path[1024]; ! int db_file; ! int es_hub = 0; ! char *p, *p2, *p3, *p4; ! char que_bdd = ESNET_NICKDB; ! unsigned long mascara_bdd; ! int cont; ! struct tabla_en_memoria mapeo; ! ! ! if (!IsServer(sptr) || parc < 5) ! return 0; ! db = atol(parv[2]); ! if (find_conf_host(cptr->confs, cptr->name, CONF_HUB) != NULL) ! es_hub = !0; ! if (!db) ! { ! db = atol(parv[4]); ! ! if (parc == 6) ! { ! que_bdd = *parv[5]; ! if ((que_bdd < 'a') || (que_bdd > 'z')) ! if ((que_bdd < '2') || (que_bdd > '9') || (*parv[3] != 'J')) ! return 0; ! else ! que_bdd = ESNET_NICKDB; ! } ! mascara_bdd = ((unsigned long)1) << (que_bdd - ESNET_BDD); ! ! switch (*parv[3]) ! { ! case 'B': ! if (es_hub) ! sendto_one(sptr, "%s DB %s 0 J %lu %c", ! NumServ(&me), parv[0], tabla_serie[que_bdd], que_bdd); return 0; ! break; ! ! case 'J': ! if ((parc == 6) && (*parv[5] >= '2') && (*parv[5] <= '9')) { /* ** Informamos del estado de nuestras BDD */ ! for (cont = ESNET_BDD; cont <= ESNET_BDD_END; cont++) ! { ! if (cont != ESNET_NICKDB) /* No mandamos nicks de nuevo */ sendto_one(sptr, "%s DB %s 0 J %lu %c", ! NumServ(&me), parv[0], tabla_serie[cont], cont); } - } /* ** No hay problemas de CPU en el --- 951,1002 ---- * 29/May/98 jcea@argo.es * */ ! int m_db(aClient *cptr, aClient *sptr, int parc, char *parv[]) { ! unsigned long db; ! aClient *acptr; ! Dlink *lp; ! char db_buf[1024], db_buf2[1024]; ! char path[1024]; ! int db_file; ! int es_hub = 0; ! char *p, *p2, *p3, *p4; ! char que_bdd = ESNET_NICKDB; ! unsigned long mascara_bdd; ! int cont; ! struct tabla_en_memoria mapeo; ! if (!IsServer(sptr) || parc < 5) return 0; ! db = atol(parv[2]); ! if (find_conf_host(cptr->confs, cptr->name, CONF_HUB) != NULL) ! es_hub = !0; if (!db) { + db = atol(parv[4]); if (parc == 6) + { + que_bdd = *parv[5]; + if ((que_bdd < 'a') || (que_bdd > 'z')) + if ((que_bdd < '2') || (que_bdd > '9') || (*parv[3] != 'J')) + return 0; + else + que_bdd = ESNET_NICKDB;} + mascara_bdd = ((unsigned long)1) << (que_bdd - ESNET_BDD); + switch (*parv[3]) + { + case 'B': + if (es_hub) + sendto_one(sptr, "%s DB %s 0 J %lu %c", + NumServ(&me), parv[0], tabla_serie[que_bdd], que_bdd); + return 0; break; case 'J': + if ((parc == 6) && (*parv[5] >= '2') && (*parv[5] <= '9')) + { /* ** Informamos del estado de nuestras BDD */ ! for (cont = ESNET_BDD; cont <= ESNET_BDD_END; cont++) ! { ! if (cont != ESNET_NICKDB) /* No mandamos nicks de nuevo */ sendto_one(sptr, "%s DB %s 0 J %lu %c", ! NumServ(&me), parv[0], tabla_serie[cont], cont);} } /* ** No hay problemas de CPU en el *************** *** 1014,1103 **** ** limitar el LAG y el caudal ** consumido. */ ! cont = 100; ! ! if (db >= tabla_serie[que_bdd]) ! { /* Se le pueden mandar registros individuales */ ! sptr->serv->esnet_db |= mascara_bdd; ! return 0; ! break; ! } ! else if ((sptr->serv->esnet_db) & mascara_bdd) ! { /* ** Teniamos el grifo abierto, y ahora ** nos esta pidiendo registros antiguos. ** Eso SOLO ocurre si ha detectado que su ** copia local de la BDD esta corrupta. */ ! sptr->serv->esnet_db &= ~mascara_bdd; /* ** Borramos su BDD porque es posible ** que le hayamos enviado mas registros. ** Es preferible empezar desde cero. */ ! sendto_one(sptr, "%s DB %s 0 D BDD_CORRUPTA %c", ! NumServ(&me), sptr->name, que_bdd); ! db = 0; /* Nos curamos en salud; se la enviamos entera */ ! } ! db_file = abrir_db(db + 1, db_buf, que_bdd, &mapeo); ! if (db_file == -1) ! return 0; /* Problemas con la DB */ ! do ! { ! p = strchr(db_buf, ' '); ! if (p == NULL) ! continue; ! *p++ = '\0'; ! p2 = strchr(p, ' '); ! if (p2 == NULL) continue; ! *p2++ = '\0'; ! p3 = strchr(p2, ' '); ! if (p3 == NULL) continue; ! *p3++ = '\0'; ! p4 = strchr(p3, ' '); ! if (p4 == NULL) ! { sendto_one(sptr, "%s DB %s %s %s %s", NumServ(&me), p, db_buf, p2, ! p3); ! } else - { - *p4++ = '\0'; - sendto_one(sptr, "%s DB %s %s %s %s :%s", NumServ(&me), p, db_buf, - p2, p3, p4); - } - if (!(--cont)) - break; - } - while (leer_db(&mapeo, db_buf) != -1); - cerrar_db(&mapeo); - if (cont) - sptr->serv->esnet_db |= mascara_bdd; - else sendto_one(sptr, "%s DB %s 0 B %lu %c", ! NumServ(&me), parv[0], tabla_serie[que_bdd], que_bdd); ! return 0; ! break; ! ! case 'D': ! if (!es_hub) ! return 0; /* ** Por bug en lastNNServer no se puede usar 'find_match_server()' */ ! collapse(parv[1]); ! if (!match(parv[1], me.name)) { sprintf_irc(path, "%s/tabla.%c", DBPATH, que_bdd); alarm(3); db_file = open(path, O_TRUNC, S_IRUSR | S_IWUSR); close(db_file); if (db_file == -1) ! db_die("Error al intentar truncar (open)", que_bdd); alarm(0); borrar_db(que_bdd); almacena_hash(que_bdd); --- 1004,1073 ---- ** limitar el LAG y el caudal ** consumido. */ ! cont = 100; if (db >= tabla_serie[que_bdd]) ! { /* Se le pueden mandar registros individuales */ ! sptr->serv->esnet_db |= mascara_bdd; return 0; break;} ! else ! if ((sptr->serv->esnet_db) & mascara_bdd) ! { /* ** Teniamos el grifo abierto, y ahora ** nos esta pidiendo registros antiguos. ** Eso SOLO ocurre si ha detectado que su ** copia local de la BDD esta corrupta. */ ! sptr->serv->esnet_db &= ~mascara_bdd; /* ** Borramos su BDD porque es posible ** que le hayamos enviado mas registros. ** Es preferible empezar desde cero. */ ! sendto_one(sptr, "%s DB %s 0 D BDD_CORRUPTA %c", ! NumServ(&me), sptr->name, que_bdd); db = 0; /* Nos curamos en salud; se la enviamos entera */ ! } ! db_file = abrir_db(db + 1, db_buf, que_bdd, &mapeo); ! if (db_file == -1) return 0; /* Problemas con la DB */ ! do ! { ! p = strchr(db_buf, ' '); ! if (p == NULL) continue; ! *p++ = '\0'; ! p2 = strchr(p, ' '); ! if (p2 == NULL) continue; ! *p2++ = '\0'; ! p3 = strchr(p2, ' '); ! if (p3 == NULL) ! continue; *p3++ = '\0'; p4 = strchr(p3, ' '); if (p4 == NULL) ! { sendto_one(sptr, "%s DB %s %s %s %s", NumServ(&me), p, db_buf, p2, ! p3);} ! else ! { ! *p4++ = '\0'; ! sendto_one(sptr, "%s DB %s %s %s %s :%s", NumServ(&me), p, db_buf, ! p2, p3, p4);} ! if (!(--cont)) break;} ! while (leer_db(&mapeo, db_buf) != -1); ! cerrar_db(&mapeo); if (cont) sptr->serv->esnet_db |= mascara_bdd; else sendto_one(sptr, "%s DB %s 0 B %lu %c", ! NumServ(&me), parv[0], tabla_serie[que_bdd], que_bdd); ! return 0; break; case 'D': ! if (!es_hub) return 0; /* ** Por bug en lastNNServer no se puede usar 'find_match_server()' */ ! collapse(parv[1]); if (!match(parv[1], me.name)) { sprintf_irc(path, "%s/tabla.%c", DBPATH, que_bdd); alarm(3); db_file = open(path, O_TRUNC, S_IRUSR | S_IWUSR); close(db_file); if (db_file == -1) ! db_die("Error al intentar truncar (open)", que_bdd); alarm(0); borrar_db(que_bdd); almacena_hash(que_bdd); *************** *** 1109,1202 **** ** traves del que llega la peticion. */ sendto_one(sptr, "%s DB %s 0 E %s %c\n", ! NumServ(&me), sptr->name, parv[4], que_bdd); ! } /* ** Como no sabemos si el otro extremo nos ha ** cerrado el grifo o no, nos curamos en salud */ ! sendto_one(cptr, "%s DB %s 0 J %lu %c", ! NumServ(&me), cptr->name, tabla_serie[que_bdd], que_bdd); ! ! sprintf(db_buf, "%s DB %s 0 D %s %c", ! NumServ(sptr), parv[1], parv[4], que_bdd); ! ! for (lp = me.serv->down; lp; lp = lp->next) ! { ! if (lp->value.cptr == cptr) ! continue; /* ** No sabemos si la otra punta ** va a cumplir la mascara, asi que ** nos curamos en salud. */ ! lp->value.cptr->serv->esnet_db &= ~mascara_bdd; ! ! sendto_one(lp->value.cptr, db_buf); ! } ! ! return 0; ! break; ! case 'E': /* Podemos ser destinatarios si el otro estaba corrupto */ ! case 'R': ! if ((acptr = find_match_server(parv[1])) && (!IsMe(acptr))) sendto_one(acptr, "%s DB %s 0 %c %s %c", NumServ(sptr), ! acptr->name, *parv[3], parv[4], que_bdd); ! return 0; ! break; ! ! case 'Q': ! if (!es_hub) ! return 0; /* ** Por bug en lastNNServer no se puede usar 'find_match_server()' */ ! collapse(parv[1]); ! if (!match(parv[1], me.name)) { inttobase64(db_buf, tabla_hash_hi[que_bdd], 6); inttobase64(db_buf + 6, tabla_hash_lo[que_bdd], 6); sendto_one(sptr, "%s DB %s 0 R %lu-%s-%s %c", ! NumServ(&me), sptr->name, tabla_serie[que_bdd], ! db_buf, parv[4], que_bdd); ! } ! sprintf(db_buf, "%s DB %s 0 Q %s %c", ! NumServ(sptr), parv[1], parv[4], que_bdd); ! ! for (lp = me.serv->down; lp; lp = lp->next) ! { if (lp->value.cptr == cptr) ! continue; ! sendto_one(lp->value.cptr, db_buf); ! } ! return 0; ! break; ! } ! return 0; ! } /* Nuevo registro */ ! que_bdd = *parv[3]; ! if ((que_bdd < 'a') || (que_bdd > 'z')) ! { ! if (que_bdd == 'N') ! que_bdd = ESNET_NICKDB; ! else ! return 0; ! } ! ! mascara_bdd = ((unsigned long)1) << (que_bdd - ESNET_BDD); ! ! if (db <= tabla_serie[que_bdd]) ! return 0; ! if (!es_hub) ! return 0; /* ** Ojo, hay que usar 'db' y no 'parv[2]' ** porque en la cadena de formateo se --- 1079,1142 ---- ** traves del que llega la peticion. */ sendto_one(sptr, "%s DB %s 0 E %s %c\n", ! NumServ(&me), sptr->name, parv[4], que_bdd);} /* ** Como no sabemos si el otro extremo nos ha ** cerrado el grifo o no, nos curamos en salud */ ! sendto_one(cptr, "%s DB %s 0 J %lu %c", ! NumServ(&me), cptr->name, tabla_serie[que_bdd], que_bdd); ! sprintf(db_buf, "%s DB %s 0 D %s %c", ! NumServ(sptr), parv[1], parv[4], que_bdd); ! for (lp = me.serv->down; lp; lp = lp->next) ! { ! if (lp->value.cptr == cptr) continue; /* ** No sabemos si la otra punta ** va a cumplir la mascara, asi que ** nos curamos en salud. */ ! lp->value.cptr->serv->esnet_db &= ~mascara_bdd; ! sendto_one(lp->value.cptr, db_buf);} ! return 0; break; case 'E': /* Podemos ser destinatarios si el otro estaba corrupto */ ! case 'R': ! if ((acptr = find_match_server(parv[1])) && (!IsMe(acptr))) sendto_one(acptr, "%s DB %s 0 %c %s %c", NumServ(sptr), ! acptr->name, *parv[3], parv[4], que_bdd); return 0; break; case 'Q': ! if (!es_hub) return 0; /* ** Por bug en lastNNServer no se puede usar 'find_match_server()' */ ! collapse(parv[1]); if (!match(parv[1], me.name)) { inttobase64(db_buf, tabla_hash_hi[que_bdd], 6); inttobase64(db_buf + 6, tabla_hash_lo[que_bdd], 6); sendto_one(sptr, "%s DB %s 0 R %lu-%s-%s %c", ! NumServ(&me), sptr->name, tabla_serie[que_bdd], ! db_buf, parv[4], que_bdd);} ! sprintf(db_buf, "%s DB %s 0 Q %s %c", ! NumServ(sptr), parv[1], parv[4], que_bdd); ! for (lp = me.serv->down; lp; lp = lp->next) ! { if (lp->value.cptr == cptr) ! continue; sendto_one(lp->value.cptr, db_buf);} ! return 0; break;} ! return 0;} /* Nuevo registro */ ! que_bdd = *parv[3]; if ((que_bdd < 'a') || (que_bdd > 'z')) ! { ! if (que_bdd == 'N') que_bdd = ESNET_NICKDB; ! else ! return 0;} + mascara_bdd = ((unsigned long)1) << (que_bdd - ESNET_BDD); + if (db <= tabla_serie[que_bdd]) return 0; if (!es_hub) return 0; /* ** Ojo, hay que usar 'db' y no 'parv[2]' ** porque en la cadena de formateo se *************** *** 1207,1257 **** ** utilizado en un HASH y todos los ** nodos deberian dar el mismo valor. */ ! if (parc == 5) ! sprintf_irc(db_buf, "%s DB %s %lu %s %s", ! NumServ(sptr), parv[1], db, parv[3], parv[4]); ! else ! sprintf_irc(db_buf, "%s DB %s %lu %s %s :%s", ! NumServ(sptr), parv[1], db, parv[3], parv[4], parv[5]); ! ! for (lp = me.serv->down; lp; lp = lp->next) ! { ! if (!((lp->value.cptr->serv->esnet_db) & mascara_bdd) || ! (lp->value.cptr == cptr)) continue; ! sendto_one(lp->value.cptr, db_buf); ! } ! ! sprintf_irc(path, "%s/tabla.%c", DBPATH, que_bdd); ! alarm(3); ! db_file = open(path, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR); ! if (db_file == -1) ! db_die("Error al intentar an~adir nuevo registro (open)", que_bdd); ! alarm(0); ! ! if (parc == 5) ! sprintf_irc(db_buf, "%lu %s %s %s\n", db, parv[1], parv[3], parv[4]); ! else ! sprintf_irc(db_buf, "%lu %s %s %s %s\n", db, parv[1], parv[3], parv[4], ! parv[5]); ! ! strcpy(db_buf2, db_buf); /* db_alta modifica la cadena */ ! if (strcmp(parv[4], "*")) ! db_alta(db_buf2, que_bdd, !0); /* CheckPoint */ ! ! alarm(3); ! if (strcmp(parv[4], "*")) ! { /* CheckPoint */ ! if (write(db_file, db_buf, strlen(db_buf)) == -1) ! db_die("Error al intentar an~adir nuevo registro (write)", que_bdd); ! } ! close(db_file); ! alarm(0); ! ! if (!strcmp(parv[4], "*")) ! db_pack(db_buf, que_bdd); ! return 0; ! } #endif /* DB_ESNET */ --- 1147,1184 ---- ** utilizado en un HASH y todos los ** nodos deberian dar el mismo valor. */ ! if (parc == 5) ! sprintf_irc(db_buf, "%s DB %s %lu %s %s", ! NumServ(sptr), parv[1], db, parv[3], parv[4]); ! else ! sprintf_irc(db_buf, "%s DB %s %lu %s %s :%s", ! NumServ(sptr), parv[1], db, parv[3], parv[4], parv[5]); ! for (lp = me.serv->down; lp; lp = lp->next) ! { ! if (!((lp->value.cptr->serv->esnet_db) & mascara_bdd) || ! (lp->value.cptr == cptr)) continue; ! sendto_one(lp->value.cptr, db_buf);} ! sprintf_irc(path, "%s/tabla.%c", DBPATH, que_bdd); ! alarm(3); ! db_file = ! open(path, O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR); ! if (db_file == ! -1) db_die("Error al intentar an~adir nuevo registro (open)", ! que_bdd); alarm(0); ! if (parc == 5) sprintf_irc(db_buf, "%lu %s %s %s\n", db, parv[1], ! parv[3], parv[4]); ! else ! sprintf_irc(db_buf, "%lu %s %s %s %s\n", db, parv[1], parv[3], ! parv[4], parv[5]); strcpy(db_buf2, db_buf); /* db_alta modifica la cadena */ ! if (strcmp(parv[4], "*")) db_alta(db_buf2, que_bdd, !0); /* CheckPoint */ ! alarm(3); if (strcmp(parv[4], "*")) ! { /* CheckPoint */ ! if (write(db_file, db_buf, strlen(db_buf)) == -1) ! db_die("Error al intentar an~adir nuevo registro (write)", que_bdd);} ! close(db_file); ! alarm(0); ! if (!strcmp(parv[4], "*")) db_pack(db_buf, que_bdd); return 0;} #endif /* DB_ESNET */ *************** *** 1262,1282 **** * Muestra error protocolo DBH a los opers. * 1999/06/28 savage@apostols.org */ ! void dbh_violacion(int parc, char *parv[], char *causa) ! { ! int i; ! char line[2048]; ! sprintf_irc(line, "%s %s ", parv[0], MSG_DBH); ! for (i = 1; i < parc; i++) ! { ! strcat(line, parv[i]); ! strcat(line, " "); ! } ! ! sendto_ops("Error DBH: %s", causa); ! sendto_ops("Debug DBH: %s", line); ! } /* * m_dbq --- 1189,1204 ---- * Muestra error protocolo DBH a los opers. * 1999/06/28 savage@apostols.org */ ! void dbh_violacion(int parc, char *parv[], char *causa) { ! int i; ! char line[2048]; ! sprintf_irc(line, "%s %s ", parv[0], MSG_DBH); ! for (i = 1; i < parc; i++) ! { ! strcat(line, parv[i]); strcat(line, " ");} ! sendto_ops("Error DBH: %s", causa); ! sendto_ops("Debug DBH: %s", line);} /* * m_dbq *************** *** 1287,1382 **** * Maneja los mensajes DBQ recibidos de users y servers. * 1999/10/13 savage@apostols.org */ ! int m_dbq(aClient *cptr, aClient *sptr, int parc, char *parv[]) ! { ! char tabla, *clave, *servidor; ! aClient *acptr; ! struct dbh_reg *reg; ! ! if (!IsServer(sptr) && !IsOper(sptr) && !IsHelpOp(sptr)) ! return 0; /* No autorizado */ ! ! /* DBQ [] */ ! if (parc != 3 && parc != 4) ! { ! ! if (!IsServer(sptr)) ! sendto_one(cptr, ! ":%s NOTICE %s :Parametros incorrectos: Formato: DBQ [] ", ! me.name, parv[0]); ! return 0; ! } ! ! if (parc == 3) ! { ! servidor = NULL; /* no nos indican server */ ! tabla = *parv[1]; ! clave = parv[2]; ! } ! else ! { ! servidor = parv[1]; ! tabla = *parv[2]; ! clave = parv[3]; ! ! if (*servidor == '*') ! { ! /* WOOW, BROADCAST */ ! sendto_serv_butone(cptr, ":%s DBQ * %c %s", parv[0], tabla, clave); ! } ! else ! { ! /* NOT BROADCAST */ ! if (!(acptr = find_match_server(servidor))) ! { ! /* joer, el server de destino no existe */ ! sendto_one(cptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], servidor); ! return 0; ! } ! ! if (!IsMe(acptr)) /* no es para mi, a rutar */ ! { ! sendto_one(acptr, ":%s DBQ %s %c %s", parv[0], servidor, tabla, clave); ! return 0; /* ok, rutado, fin del trabajo */ ! } ! } ! } ! ! if (!tabla_residente[tabla]) ! { ! if (MyUser(sptr) || Protocol(cptr) < 10) ! sendto_one(cptr, ":%s NOTICE %s :DBQ ERROR TABLA_NO_RESIDENTE", ! me.name, parv[0]); ! else ! sendto_one(cptr, "%s NOTICE %s%s :DBQ ERROR TABLA_NO_RESIDENTE", ! NumServ(&me), NumNick(sptr)); ! return 0; ! } ! ! reg = dbh_buscar_registro(tabla, clave); ! if (!reg) ! { ! if (MyUser(sptr) || Protocol(cptr) < 10) ! sendto_one(cptr, ":%s NOTICE %s :DBQ ERROR REGISTRO_NO_ENCONTRADO", ! me.name, parv[0]); ! else ! sendto_one(cptr, "%s NOTICE %s%s :DBQ ERROR REGISTRO_NO_ENCONTRADO", ! NumServ(&me), NumNick(sptr)); ! return 0; ! } ! ! if (MyUser(sptr) || Protocol(cptr) < 10) ! sendto_one(cptr, ! ":%s NOTICE %s :DBQ OK Tabla='%c' Destino='%s' Clave='%s' Valor='%s'", ! me.name, parv[0], tabla, reg->destino, reg->clave, reg->valor); ! else ! sendto_one(cptr, ! "%s NOTICE %s%s :DBQ OK Tabla='%c' Destino='%s' Clave='%s' Valor='%s'", ! NumServ(&me), NumNick(sptr), tabla, reg->destino, reg->clave, ! reg->valor); ! ! return 0; ! } #endif /* DB_HISPANO */ --- 1209,1286 ---- * Maneja los mensajes DBQ recibidos de users y servers. * 1999/10/13 savage@apostols.org */ ! int m_dbq(aClient *cptr, aClient *sptr, int parc, char *parv[]) { ! char tabla, *clave, *servidor; ! aClient *acptr; ! struct dbh_reg * reg; ! if (!IsServer(sptr) && !IsOper(sptr) && !IsHelpOp(sptr)) return 0; /* No autorizado */ ! /* DBQ [] */ ! if (parc != 3 && parc != 4) ! { ! ! if (!IsServer(sptr)) ! sendto_one(cptr, ! ":%s NOTICE %s :Parametros incorrectos: Formato: DBQ [] ", ! me.name, parv[0]); return 0;} ! ! if (parc == 3) ! { ! servidor = NULL; /* no nos indican server */ ! tabla = *parv[1]; clave = parv[2];} ! else ! { ! servidor = parv[1]; ! tabla = *parv[2]; clave = parv[3]; if (*servidor == '*') ! { ! /* WOOW, BROADCAST */ ! sendto_serv_butone(cptr, ":%s DBQ * %c %s", parv[0], tabla, ! clave);} ! else ! { ! /* NOT BROADCAST */ ! if (!(acptr = find_match_server(servidor))) ! { ! /* joer, el server de destino no existe */ ! sendto_one(cptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], ! servidor); return 0;} ! ! if (!IsMe(acptr)) /* no es para mi, a rutar */ ! { ! sendto_one(acptr, ":%s DBQ %s %c %s", parv[0], servidor, ! tabla, clave); return 0; /* ok, rutado, fin del trabajo */ ! } ! } ! } ! ! if (!tabla_residente[tabla]) ! { ! if (MyUser(sptr) || Protocol(cptr) < 10) ! sendto_one(cptr, ":%s NOTICE %s :DBQ ERROR TABLA_NO_RESIDENTE", ! me.name, parv[0]); ! else ! sendto_one(cptr, "%s NOTICE %s%s :DBQ ERROR TABLA_NO_RESIDENTE", ! NumServ(&me), NumNick(sptr)); return 0;} ! ! reg = dbh_buscar_registro(tabla, clave); if (!reg) ! { ! if (MyUser(sptr) || Protocol(cptr) < 10) ! sendto_one(cptr, ! ":%s NOTICE %s :DBQ ERROR REGISTRO_NO_ENCONTRADO", me.name, ! parv[0]); ! else ! sendto_one(cptr, ! "%s NOTICE %s%s :DBQ ERROR REGISTRO_NO_ENCONTRADO", NumServ(&me), ! NumNick(sptr)); return 0;} ! ! if (MyUser(sptr) || Protocol(cptr) < 10) ! sendto_one(cptr, ! ":%s NOTICE %s :DBQ OK Tabla='%c' Destino='%s' Clave='%s' Valor='%s'", ! me.name, parv[0], tabla, reg->destino, reg->clave, reg->valor); ! else ! sendto_one(cptr, ! "%s NOTICE %s%s :DBQ OK Tabla='%c' Destino='%s' Clave='%s' Valor='%s'", ! NumServ(&me), NumNick(sptr), tabla, reg->destino, reg->clave, ! reg->valor); return 0;} #endif /* DB_HISPANO */ Index: ../ircu2.10.06/ircd/s_debug.c =================================================================== RCS file: /cvsroot/ircd/ircd/s_debug.c,v retrieving revision 1.72 retrieving revision 1.73 diff -c -r1.72 -r1.73 *** ../ircu2.10.06/ircd/s_debug.c 1999/10/27 12:38:37 1.72 --- ../ircu2.10.06/ircd/s_debug.c 1999/10/27 14:42:13 1.73 *************** *** 191,197 **** '-', #endif #endif ! 'D','B','4','8', #ifdef DB_ESNET '+', #else --- 191,197 ---- '-', #endif #endif ! 'D','B','4','9', #ifdef DB_ESNET '+', #else