2013-04-18 21 views
5

Tôi muốn sử dụng chương trình C để nhận được nếu ip của giao diện mạng được đặt thủ công hoặc thông qua dhcp.Cách tìm hiểu xem chế độ eth0 là tĩnh hay dhcp?

Tôi đã cố gắng sử dụng mã sau và nó đã hoạt động trong Debian, nhưng nó không hoạt động trong OpenWrt. Tôi muốn biết làm thế nào để viết một chương trình C làm điều này trong OpenWrt. Tôi đã cố gắng sử dụng này:

#include <stdio.h> 
int main(void) 
{ 
    FILE *fp; 
    char buffer[80]; 
    fp=popen("cat /etc/network/interfaces |grep ^iface\\ br-lan | awk -F ' ' '{print $4}'","r"); 
    fgets(buffer, sizeof(buffer), fp); 
    printf("%s", buffer); 
    pclose(fp); 
} 

Mã này được làm việc trong Debian, nhưng nó không hoạt động bình thường trong openWRT, vì vậy tôi muốn biết làm thế nào để viết một chương trình để có được kết quả tương tự.

+1

câu hỏi hay (+1) nhưng bạn đã thử những gì? – MOHAMED

+0

có nguy cơ bị bỏ phiếu nếu bạn không cung cấp những gì bạn đã thử – MOHAMED

+0

Bạn có muốn nói chung hoặc cho một hệ điều hành cụ thể không? – jbr

Trả lời

7

cho OpenWRT bạn có thể nhận được một thông tin đó với các lệnh sau:

$uci get network.lan.proto 

vì vậy tôi có những chương trình bạn đặt trong câu hỏi của bạn và tôi chỉ thay đổi các lệnh sử dụng để thu thập thông tin:

#include <stdio.h> <br> 
int main(void) 
{ 
    FILE *fp; 
    char buffer[80]; 
    fp=popen("uci get network.lan.proto","r"); 
    fgets(buffer, sizeof(buffer), fp); 
    printf("%s", buffer); 
    pclose(fp); 
} 

để xem tất cả các giao diện mạng có sẵn trong OpenWRT của bạn, bạn có thể sử dụng lệnh sau:

$uci show network 

Bạn có thể tránh sử dụng lệnh gọi linux trong c bằng cách sử dụng libuci. Các libuci chứa chức năng C để thực thi lệnh uci mà không đi qua popen (popen được sử dụng để thực hiện lệnh bên ngoài từ trình bao).

Các libuci tồn tại theo mặc định trong môi trường phát triển của OpenWRT, không cần phải tải về nó, không cần phải xây dựng nó và không cần phải cài đặt nó trên máy OpenWRT bạn

Bạn có thể sử dụng libuci theo cách này

#include <uci.h> 
void main() 
{ 
    char path[]="network.lan.proto"; 
    char buffer[80]; 
    struct uci_ptr ptr; 
    struct uci_context *c = uci_alloc_context(); 

    if(!c) return; 

    if ((uci_lookup_ptr(c, &ptr, path, true) != UCI_OK) || 
     (ptr.o==NULL || ptr.o->v.string==NULL)) { 
     uci_free_context(c); 
     return; 
    } 

    if(ptr.flags & UCI_LOOKUP_COMPLETE) 
      strcpy(buffer, ptr.o->v.string); 

    uci_free_context(c); 

    printf("%s\n", buffer); 
} 

(Không kiểm tra)

và khi bạn biên dịch chương trình của bạn, bạn phải thêm -luci trong lệnh biên soạn gcc

+0

Xin chào MOHAMED cảm ơn sự giúp đỡ của bạn! mã đầu tiên sử dụng lệnh uci là tốt! Mã thứ hai mà tôi không thể sử dụng nó, bởi vì tôi phải sử dụng -luci. Có lẽ tôi sẽ thử lại sau, và cảm ơn lần nữa – stephen

+0

@stephen u r welcome – MOHAMED

+0

Tôi đề nghị có thể sử dụng -P/var/state/flag trên lệnh uci để xem trạng thái hiện tại của hệ thống thay vì cấu hình mặc định. Bằng cách này, nếu vì một lý do kỳ lạ nào đó, ai đó đã thay đổi uci để sử dụng dhcp từ tĩnh và không có cam kết uci nào được thực hiện thì nó sẽ được phản ánh. Nhưng yea giải pháp thứ hai là tốt nhất! – 0xception

1

Có AFAIK không có cách dứt khoát nào.

Đọc tệp giao diện sẽ chỉ là gợi ý: không đảm bảo rằng hiện tại seup đến từ đó.

Bạn có thể xem 'hỏi' giao diện DBUS nếu có. Bạn có thể kiểm tra quá trình chạy dhclient. Bạn có thể kiểm tra các tệp khác trong/etc chỉ định thiết lập mạng trên các bản phân phối khác nhau.

Tôi nghĩ rằng tùy chọn đáng tin cậy nhất sẽ là một điều nhiều lớp: kiểm tra toàn bộ các gợi ý để đưa ra câu trả lời.

Tùy chọn khác: gửi gói kiểm tra DHCP tới máy chủ DHCP để xác minh địa chỉ .. nếu bạn không nhận được câu trả lời mặc dù mạng có thể bị hỏng nhưng đã hết khi địa chỉ được cấp phát.

+0

Tôi nghĩ bạn không biết tôi muốn gì. Tôi chỉ muốn biết cách lập trình để có phương thức của giao diện mạng là dhcp hoặc tĩnh. Không sử dụng chương trình vỏ và bất kỳ cách nào khác, và chỉ sử dụng lập trình c linux. – stephen

+1

Tôi đã nhận ra rằng ... nhưng không có bản ghi trong giao diện chính nó của những gì bạn muốn biết, vì vậy bạn đang yêu cầu một cái gì đó mà không được ghi lại. – rivimey

2

Không cần cách nào để hệ điều hành quyết định cách cấu hình giao diện. Nhân (phần Linux của GNU/Linux) không quyết định, nó không (và không nên) quan tâm, nó chỉ được cho biết địa chỉ mạng nào đi với giao diện nào bởi hệ điều hành nào đang sử dụng.OpenWRT không phải GNU, nó hoạt động khác nhau.

Các vấn đề liên quan