1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
| #include <stdio.h>
| #include <unistd.h>
| #include <string.h>
| #include <errno.h>
| #include <sys/types.h>
| #include <sys/stat.h>
| #include <fcntl.h>
| #include <ctype.h>
|
| #define TMP_FILE "/tmp/.ifconfig.log"
|
| int main(int argc, char **argv)
| {
| pid_t pid;
| int fd;
| char buf[1024];
| int rv;
| char *ptr;
| FILE *fp;
| char *ip_start;
| char *ip_end;
| char ipaddr[16];
|
| if( (fd=open(TMP_FILE, O_RDWR|O_CREAT|O_TRUNC, 0644)) < 0 )
| {
| printf("Redirect standard output to file failure: %s\n", strerror(errno));
| return -1;
| }
|
| pid = fork();
| if(pid < 0)
| {
| printf("fork() create child process failure: %s\n", strerror(errno));
| return -1;
| }
| else if( pid == 0 )
| {
| printf("Child process start excute ifconfig program\n");
| dup2(fd, STDOUT_FILENO);
| execl("/sbin/ifconfig", "ifconfig", "eth0", NULL);
| printf("Child process excute another program, will not return here. Return here means execl() error\n");
| return -1;
| }
| else
| {
| sleep(3);
| }
|
| memset(buf, 0, sizeof(buf));
|
| rv=read(fd, buf, sizeof(buf));
| printf("Read %d bytes data dierectly read after child process write\n", rv);
|
| memset(buf, 0, sizeof(buf));
| lseek(fd, 0, SEEK_SET);
| rv=read(fd, buf, sizeof(buf));
| printf("Read %d bytes data after lseek:\n %s", rv, buf);
|
| fp = fdopen(fd, "r");
| fseek(fp, 0, SEEK_SET);
|
| while( fgets(buf, sizeof(buf), fp) )
| {
| if( strstr(buf, "netmask") )
| {
| ptr=strstr(buf, "inet");
| if( !ptr )
| {
| break;
| }
| ptr += strlen("inet");
|
| while( isblank(*ptr) )
| ptr++;
|
| ip_start = ptr;
|
| while( !isblank(*ptr) )
| ptr++;
|
| ip_end = ptr;
|
| memset(ipaddr, 0, sizeof(ipaddr));
| memcpy(ipaddr, ip_start, ip_end-ip_start);
|
| break;
| }
| }
|
| printf("Parser and get IP address: %s\n", ipaddr);
|
| fclose(fp);
| unlink(TMP_FILE);
|
| return 0;
| }
|
|