Dns değiştiren C uygulaması örneği

Başlatan BehroozWolf, 19 Haziran 2010 - 16:17:04

« önceki - sonraki »

0 Üyeler ve 3 Ziyaretçi konuyu incelemekte.

BehroozWolf

Can sıkıntısını gidermek amacıyla ufak bir kod parçası yazmıştım. Tamamen can sıkıntısının bir parçasıdır, istenilildiği gibi kullanılabilir.
/*
Bu kod parçası Linux sürümlerinde dns değiştirme işlemini kolaylaştırmak, tek tuşla halletmeyi amaçlamak için yazılmıştır. Tamamen can sıkıntısının bir parçasıdır, istenildiği gibi kullanılabilir.

NOT: Çalışması için sisteminizde 'sudo' kurulu olmalıdır.

Written by BehroozWolf <behroom@yahoo.com>

Güncelleme: v0.2
Kodlama yapısı gözden geçirildi.
Kullanılan dns adresleri eklendi.
*/

#include <stdlib.h>
#include <libgen.h>
#include <stdio.h>
#include <string.h>

void dnslerim(void);
void google(void);
void opendns(void);
void comodo(void);
void tubitak(void);
void tiscali(void);
void dnsgir(void);

// Google DNS
#define Google1  "8.8.8.8"
#define Google2  "8.8.8.4"
// OpenDNS
#define OpenDNS1 "208.67.222.222"
#define OpenDNS2 "208.67.220.220"
// Comodo
#define Comodo1  "156.154.70.22"
#define Comodo2  "156.154.71.22"
// Tubitak
#define Tubitak1 "193.140.100.210"
#define Tubitak2 "193.140.100.215"
// Tiscali
#define Tiscali1 "195.241.77.53"
#define Tiscali2 "195.241.77.54"

int main()
{
char homedir[256], dirname[256];
int sec;

strcpy(homedir, getenv("HOME"));
strcpy(dirname, basename(homedir));
system("clear");
printf("\033[1;32mKullanımda olan dnsleriniz;\e[0m\n");
dnslerim();
printf("\n"
"******************************************************************************************\n"
"Hosgeldiniz \033[1;32m%s\e[0m! DNS değiştirme/güncelleme işleminde ki seçenekleriniz;\n"
"\n"
"\e[1;33m1 \e[1;32mGoogle DNS\e[0m\n"
"\e[1;33m2 \e[1;32mOpenDNS\e[0m\n"
"\e[1;33m3 \e[1;32mComodo DNS\e[0m\n"
"\e[1;33m4 \e[1;32mTubitak DNS\e[0m\n"
"\e[1;33m5 \e[1;32mTiscali DNS\e[0m\n"
"\e[1;33m6 \e[1;32mKendi dnssinizi girin\e[0m\n"
"******************************************************************************************\n"
"\033[1;32mPanelden cikmak icin \e[1;33m0 \033[1;32myazabilirsiniz.\033[0m\n", dirname);
scanf("%d", &sec);

switch (sec) {
case 0:
printf("\033[1;32mProgram sonlandiriliyor...\e[0m\n");
exit(1);
break;
case 1: google();
break;
case 2: opendns();
break;
case 3: comodo();
break;
case 4: tubitak();
break;
case 5: tiscali();
break;
case 6: dnsgir();
break;
default : printf("HATA: Gireceğiniz sayılar 0-6 arasinda olmalıdır!\n");
sleep(1);
}
return 0;
}

void google(void)
{
FILE *a;

a = fopen("resolv.conf", "a+");
if (a == NULL) {
printf("HATA: Dosya yaratilamiyor/acilamiyor!\n");
exit(1);
}

fprintf(a, "#Google DNS\n");
fprintf(a, "nameserver %s\n", Google1);
fprintf(a, "nameserver %s\n", Google2);
system("sudo mv /etc/resolv.conf /etc/resolv.conf.eski");
system("sudo mv resolv.conf /etc/resolv.conf");
}

void opendns(void)
{
FILE *a;

a = fopen("resolv.conf", "a+");
if (a == NULL) {
printf("HATA: Dosya yaratilamiyor/acilamiyor!\n");
exit(1);
}

fprintf(a, "#OpenDNS\n");
fprintf(a, "nameserver %s\n", OpenDNS1);
fprintf(a, "nameserver %s\n", OpenDNS2);
system("sudo mv /etc/resolv.conf /etc/resolv.conf.eski");
system("sudo mv resolv.conf /etc/resolv.conf");
}

void comodo(void)
{
FILE *a;

a = fopen("resolv.conf", "a+");
if (a == NULL) {
printf("HATA: Dosya yaratilamiyor/acilamiyor!\n");
exit(1);
}

fprintf(a, "#Comodo DNS\n");
fprintf(a, "nameserver %s\n", Comodo1);
fprintf(a, "nameserver %s\n", Comodo2);
system("sudo mv /etc/resolv.conf /etc/resolv.conf.eski");
system("sudo mv resolv.conf /etc/resolv.conf");
}

void tubitak(void)
{
FILE *a;

a = fopen("resolv.conf", "a+");
if (a == NULL) {
printf("HATA: Dosya yaratilamiyor/acilamiyor!\n");
exit(1);
}

fprintf(a, "#Tubitak DNS\n");
fprintf(a, "nameserver %s\n", Tubitak1);
fprintf(a, "nameserver %s\n", Tubitak2);
system("sudo mv /etc/resolv.conf /etc/resolv.conf.eski");
system("sudo mv resolv.conf /etc/resolv.conf");
}

void tiscali(void)
{
FILE *a;

a = fopen("resolv.conf", "a+");
if (a == NULL) {
printf("HATA: Dosya yaratilamiyor/acilamiyor!\n");
exit(1);
}

fprintf(a, "#Tiscali DNS\n");
fprintf(a, "nameserver %s\n", Tiscali1);
fprintf(a, "nameserver %s\n", Tiscali2);
system("sudo mv /etc/resolv.conf /etc/resolv.conf.eski");
system("sudo mv resolv.conf /etc/resolv.conf");
}
void dnsgir(void)
{
char n1[15], n2[15];
FILE *a;

a = fopen("resolv.conf", "a+");
if (a == NULL) {
printf("HATA: Dosya yaratilamiyor/acilamiyor!\n");
exit(1);
}

printf("Lüften kullanmak istediğiniz 1.inci dns adresini yaziniz\n");
scanf("%s", n1);
printf("Lüften kullanmak istediğiniz 2.ci dns adresini yaziniz\n");
scanf("%s", n2);
fprintf(a, "nameserver %s\n", n1);
fprintf(a, "nameserver %s\n", n2);
system("sudo mv /etc/resolv.conf /etc/resolv.conf.eski");
system("sudo mv resolv.conf /etc/resolv.conf");
printf("\033[1;32mİşlem tamamlandı. Girilen dnsler; "
"\n"
"Nameserver 1:\e[1;33m %s\n"
"\033[1;32mNameserver 2:\e[1;33m %s\e[0m\n", n1, n2);
fclose(a);
}

void dnslerim(void)
{

FILE *b;
int oku;

b = fopen("/etc/resolv.conf", "r");
if (b == NULL) {
printf("HATA: Dosya okunamiyor!\n");
exit(0);
}

while((oku = fgetc(b)) != EOF) {
printf("%c", oku);
}
fclose(b);
}

Çalıştırmak için yukarıdaki kodlari dns.c adlı bir dosyaya kayıt ediniz(ya da http://arsiv.behroozwolf.net/dns.c) adresinden indirebilirsiniz. İndirme işleminden sonra
gcc dns.c -o dns
şeklinde derledikten sonra
./dns şeklinde çalıştırabilirsiniz.

sem

Teşekkürler paylaşım için @ BehroozWolf , denedim, muhtemelen benle alakalı bir sorundan kaynaklı olarak girmedi örneğin youtube'a... Siz denemişsinizdir değil mi?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

utdmr

Camaro DNS'te bir yazım hatası var sanırım, bildiğim kadarıyla Comodo DNS adı :).
Kişisel Blogum: Çoğunlukla Zararsız - cogunluklazararsiz.org
--
Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -and a lot of courage- to move in the opposite direction.

ironic

@Behrooz teşekkürler. Benim de yapılacaklar listemde yer alıyordu. C' yi bilmiyorum. içeriğe baktığımda normal sistem komutlarını kullanabiliyoruz sanırım. resolv.conf dosyasının hangi bayrakla kilitlendiğini şu komutla öğrenebiliriz.

lsattr /etc/resolv.conf | sed 's/\-/ /g' | awk '{print $1}'

Çıktı "e" ise dosya kilitli değildir. "a" ya da "i" ise sudo ile silinemez. Çıktıya göre dosya uygun bayrakla açılıp silinebilir.


BehroozWolf

sem0900; Sevgili arkadaşım, bende tam randımanlı giremiyorum youtube'e. Bir açıyor, bir açmiyor açıkcası ne olduğunu bilemiyorum ama dns değiştirme olayı çalışıyor deneyip verdim.
utdemir; Aklım araba olan camaro'ya gitmiş özür diliyorum, düzelttim :-)
ironic: Açıkcası o kadar detayli bakmadım ama geliştirmeye açık :)

utdmr

Hadi biri de zenity'e uyarlasın şimdi :).
Kişisel Blogum: Çoğunlukla Zararsız - cogunluklazararsiz.org
--
Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -and a lot of courage- to move in the opposite direction.

sem

#6
C ile zenity kodları birleştirmenin bir yolur varsa aslında çok güzel olur gerçekten... Var mıdır mümkünatı?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

utdmr

Alıntı yapılan: sem0900 - 19 Haziran 2010 - 18:31:15
C ile zenity kodları birleştirmenin bir yolur varsa aslında çok güzel olur gerçekten... Var mıdır mümkünatı?
system() fonksiyonu ile zenity komutlarını çalıştırdığımızda aynı etkiyi yapmaz mı? system() hatırladığım kadarıyla komutun döndürdüğü değeri de döndürüyordu.
Kişisel Blogum: Çoğunlukla Zararsız - cogunluklazararsiz.org
--
Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -and a lot of courage- to move in the opposite direction.

BehroozWolf

zenity hakkında öyle çok bir bilgim yok ama biraz baktım sadece kabuk programlama için gibi geldi bana.

sem

utdemir, yani yani system() ile örneğin "ls" komutu versek, dizinde bulunan dosya ve dizinlerin isminin bulunduğu bir diziye mi dönecek?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

utdmr

Alıntı yapılan: sem0900 - 19 Haziran 2010 - 20:58:51
utdemir, yani yani system() ile örneğin "ls" komutu versek, dizinde bulunan dosya ve dizinlerin isminin bulunduğu bir diziye mi dönecek?
Hatırladığım kadarıyla, konsol çıktısı değil dönüş değerini döndürüyor system(). Yani örneğinizdeki gibi "system("ls")" olarak çağırdığımızda;
Alıntı yapılan: ls --helpExit status:
0  if OK,
1  if minor problems (e.g., cannot access subdirectory),
2  if serious trouble (e.g., cannot access command-line argument).
ls'nin sonucuna göre bunlardan biri dönecek(0,1,2 olarak).

Alıntı yapılan: http://www.cplusplus.com/reference/clibrary/cstdlib/system/Return Value

The value returned when the argument passed is not NULL, depends on the running environment specifications. In many systems, 0 is used to indicate that the command was succesfully executed and other values to indicate some sort of error.
When the argument passed is NULL, the function returns a nonzero value if the command processor is available, and zero otherwise.
Kişisel Blogum: Çoğunlukla Zararsız - cogunluklazararsiz.org
--
Any intelligent fool can make things bigger, more complex, and more violent. It takes a touch of genius -and a lot of courage- to move in the opposite direction.

sem

Alıntı Yapint system(const char *cmd);
Yani biz komut satırında hangi komutu yazabiliyorsak bu komutu sistem fonksiyonuna parametre olarak verebiliriz. System fonksiyonu şüphesiz shell programını fork ve exec ile çalıştırmaktadır. Eğer fork fonksiyonunun başarısızlığı nedeniyle sistem fonksiyonu başarısız olmuşsa –1 ile geri döner. Eğer fork başarılı fakat exec başarılı ise fonksiyon 127 ile geri döner. Eğer ikiside başarılıysa system fonksiyonu çalıştırdığı shell processinin çıkış koduyla geri döner. Shell programının çıkış kodu ise shellin çalıştırdığı programın çıkış kodudur. System aynı zamanda standart bir C fonksiyonudur. Yani bu fonksiyon DOS veWin32 sistemlerinde onların shell programlarını çalıştıracak biçimde yazılmıştır. Prototipi <stdlib.h> içerisindedir.


Geri dönüş değerlerinde farklılık var kaynaklar arasında. Bizi ilgilendiren kısım, başarılı olunduğu zaman ise, shell processinin çıkış kodu ile döner denilmiş. Zenity, örneğin evet, hayır, vazgeç gibi bir soru sorduktan sonra, atıyorum evet = 0, hayır = 1, vazgeç=2 gibi bir değer atayıp, return 0||1||2 şeklinde kendi süreç çıkışına bu değeri atıyorsa, evet olabilir, system() içine kodları gömülebilir...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

BehroozWolf

Kodlar da biraz düzenleme yaptım, en kötü bu şekilde yazilabilirdi diye düşünmeye başladım biraz :)

noktakom

yeniden başlatmaya ihtiyaç duymaması iyi olmuş, artık live cd'de de dns değiştirebileceğiz.

okan_ubuntu

C'de "dosya işleme" konusuna çok güzel bir örnek.Teşekkürler.