Index: ../ircu2.10.06/ircd/channel.c =================================================================== RCS file: /cvsroot/ircd/ircd/channel.c,v retrieving revision 1.20 retrieving revision 1.21 diff -c -r1.20 -r1.21 *** ../ircu2.10.06/ircd/channel.c 1999/10/27 12:02:38 1.20 --- ../ircu2.10.06/ircd/channel.c 1999/10/27 14:53:39 1.21 *************** *** 2220,2227 **** reg && #endif IsNickRegistered(sptr) && ! dbh_buscar_registro(BDD_OPERDB, sptr->name) ! && (!compall("OPER", key))) return 0; #endif --- 2220,2226 ---- reg && #endif IsNickRegistered(sptr) && ! dbh_buscar_registro(BDD_OPERDB, sptr->name) && (!compall("OPER", key))) return 0; #endif Index: ../ircu2.10.06/ircd/s_bdd.c =================================================================== RCS file: /cvsroot/ircd/ircd/s_bdd.c,v retrieving revision 1.12 retrieving revision 1.13 diff -c -r1.12 -r1.13 *** ../ircu2.10.06/ircd/s_bdd.c 1999/10/27 14:42:12 1.12 --- ../ircu2.10.06/ircd/s_bdd.c 1999/10/27 14:53:39 1.13 *************** *** 842,851 **** } 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 --- 842,852 ---- } 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 *************** *** 855,926 **** ** 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 --- 856,937 ---- ** 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 *************** *** 928,947 **** * 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);} ! } ! } /* --- 939,960 ---- * 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);} ! } ! } /* *************** *** 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 --- 964,1022 ---- * 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 *************** *** 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); --- 1024,1110 ---- ** 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); *************** *** 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 --- 1116,1200 ---- ** 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 *************** *** 1147,1185 **** ** 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 */ #ifdef DB_HISPANO --- 1205,1249 ---- ** 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 */ #ifdef DB_HISPANO *************** *** 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 --- 1253,1272 ---- * 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 *************** *** 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 */ --- 1277,1368 ---- * 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 */