Bir zamanlar çok istenen bir özellik..
16.06.2007 tarihinde yapmıştım, ve yayınlamaya karar verdim.
kodlama : orta~zor
ekleme (edit) : kolay~orta
tek dosya içerisinde işlem yapıyoruz:
Aşama #0:
cd ircservices-xxx
cd modules
cd operserv
pico main.c
Aşama #1:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
char * ServicesRoot;
bu kodu bulup "hemen altına" şu kodları ekleyin:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
char **Sky_Roots_Char;
static int Sky_Roots_Int;
static int Sky_Realod=0;
Aşama #2:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
static int introduce_operserv(const char *nick)
bu kodu bulup "hemen üstüne" şu kodları ekleyin:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
void Root_Ayir(char *ServicesRoot_);
void Root_Ayir(char *ServicesRoot_) {
char *Sky_Temp=NULL;
Sky_Realod=1;
if (ServicesRoot_) {
Sky_Roots_Int = 0;
Sky_Temp = strtok(ServicesRoot_, " ");
do {
if (Sky_Temp) {
Sky_Roots_Int++;
Sky_Roots_Char = realloc(Sky_Roots_Char, sizeof(char *) * Sky_Roots_Int);
Sky_Roots_Char[Sky_Roots_Int - 1] = sstrdup(Sky_Temp);
}
}
while ((Sky_Temp = strtok(NULL, " ")));
}
if (!Sky_Roots_Int)
config_error("operserv/main", 0, "No Root NickName(s) Defined");
}
Aşama #3:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
int is_services_root(User *u)
{
NickInfo *ni;
int rootid;
static int warned_ni = 0, warned_id = 0;
if (u->flags & UF_SERVROOT)
return 1;
if (!(ni = get_nickinfo(ServicesRoot))) {
if (!warned_ni) {
wallops(s_OperServ, "Warning: Services super-user nickname %s"
" is not registered", ServicesRoot);
warned_ni = 1;
}
module_log("warning: ServicesRoot nickname not registered");
return 0;
}
warned_ni = 0;
if (!(rootid = ni->nickgroup)) {
if (!warned_id) {
wallops(s_OperServ, "Warning: Services super-user nickname %s"
" is forbidden or not properly registered", ServicesRoot);
warned_id = 1;
}
module_log("warning: ServicesRoot nickname forbidden or registered"
" data corrupt");
return 0;
}
if (!is_oper(u) || !u->ni || u->ni->nickgroup != rootid)
return 0;
if (user_identified(u))
return 1;
return 0;
}
bu kodları silip yerine şu kodları ekleyin (7~8 yerde değişim olduğu için iş karışabilir, o yüzden eskiyi silip yeniyi ekleyin diyorum)
Kod: Kodu kopyalamak için üzerine çift tıklayın!
int is_services_root(User *u)
{
int i;
int ret=0;
NickInfo *ni;
int rootid;
static int warned_ni = 0, warned_id = 0;
if (u->flags & UF_SERVROOT)
return 1;
for (i = 0; i < Sky_Roots_Int; i++) {
if (!(ni = get_nickinfo(Sky_Roots_Char[i]))) {
// if (!warned_ni) {
wallops(s_OperServ, "Warning: Services super-user nickname %s"
" is not registered", Sky_Roots_Char[i]);
warned_ni = 1;
// }
module_log("warning: ServicesRoot nickname not registered");
continue;
}
// warned_ni = 0;
if (!(rootid = ni->nickgroup)) {
// if (!warned_id) {
wallops(s_OperServ, "Warning: Services super-user nickname %s"
" is forbidden or not properly registered", Sky_Roots_Char[i]);
// warned_id = 1;
// }
module_log("warning: ServicesRoot nickname forbidden or registered"
" data corrupt");
continue;
}
}
for (i = 0; i < Sky_Roots_Int; i++) {
if (!(ni = get_nickinfo(Sky_Roots_Char[i])))
continue;
if (!(rootid = ni->nickgroup))
continue;
if (!is_oper(u) || !u->ni || u->ni->nickgroup != rootid) {
ret=0;
}
else {
ret=1;
break;
}
}
if (ret && user_identified(u))
return 1;
return 0;
}
Aşama #4:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
int nick_is_services_admin(NickInfo *ni)
{
NickGroupInfo *ngi;
if (!ni || !(ngi = get_ngi(ni)))
return 0;
if (stricmp(ni->nick, ServicesRoot) == 0)
return 1;
return ngi->os_priv >= NP_SERVADMIN;
}
bu kodları silip, yerine şu kodları ekleyin;
Kod: Kodu kopyalamak için üzerine çift tıklayın!
int nick_is_services_admin(NickInfo *ni)
{
int i;
NickGroupInfo *ngi;
if (!ni || !(ngi = get_ngi(ni)))
return 0;
for (i = 0; i < Sky_Roots_Int; i++)
if (stricmp(ni->nick, Sky_Roots_Char[i]) == 0)
return 1;
//if (stricmp(ni->nick, ServicesRoot) == 0)
//return 1;
return ngi->os_priv >= NP_SERVADMIN;
}
Aşama #5:
Kod: Kodu kopyalamak için üzerine çift tıklayın!
old_clearchan_sender_set = 1;
yukarıdaki kodu bulup, hemen altına şu kodları ekleyin;
Kod: Kodu kopyalamak için üzerine çift tıklayın!
if (Sky_Realod==0)
Root_Ayir(ServicesRoot);
make & make install çekip, servislerinizi yeniden başlatınız..
kodlar biraz karışık. Bu yüzden anlayamayabilirsiniz nerde ne yapıldığını.. ama kısaca özetlemek gerekir ise;
Root satırından gelen nick verisini, aradaki boşluklara göre ayırıp, array'e aktarıp, is_service_root vs. kısmında bu arraydeki nicklerin varlığı||yokluğu şeklinde bakıyoruz.. Varsa root diyoruz. Yok ise root değil diyoruz
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
moduels.conf unuzdaki Root satırınıza bilgi girerken;
ServicesRoot Nick1 Nick2
yukarıdaki şekilde DEĞİL;
ServicesRoot "Nick1 Nick2"
şeklinde girmeniz gerekiyor..
Not : 1 defa test edip olumlu sonuç aldım..
Başka forumlarda paylaşırsanız; Kodun Kimin tarafından yapıldığını da söylemeniz dileğiyle
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
iyi Çalışmalar..