- 论坛徽章:
- 0
|
回复 4# pmerofc
static char **fill_envp(struct dhcpMessage *packet)
{
int num_options = 0;
int i, j;
unsigned char *addr;
char **envp, *temp;
char over = 0;
if (packet == NULL)
num_options = 0;
else {
for (i = 0; options.code; i++)
if (get_option(packet, options.code))
num_options++;
if (packet->siaddr) num_options++;
if ((temp = (char *)get_option(packet, DHCP_OPTION_OVER)))
over = *temp;
if (!(over & FILE_FIELD) && packet->file[0]) num_options++;
if (!(over & SNAME_FIELD) && packet->sname[0]) num_options++;
}
envp = malloc((num_options + 5) * sizeof(char *));
envp[0] = malloc(strlen("interface=") + strlen(client_config.interface) + 1);
sprintf(envp[0], "interface=%s", client_config.interface);
envp[1] = malloc(sizeof("ip=255.255.255.255"));
envp[2] = find_env("PATH", "PATH=/bin:/usr/bin:/sbin:/usr/sbin");
envp[3] = find_env("HOME", "HOME=/");
if (packet == NULL) {
envp[4] = NULL;
return envp;
}
addr = (unsigned char *) &packet->yiaddr;
sprintf(envp[1], "ip=%d.%d.%d.%d",
addr[0], addr[1], addr[2], addr[3]);
// brcm
sprintf(local_ip, "%d.%d.%d.%d",
addr[0], addr[1], addr[2], addr[3]);
strcpy(dns_ip, "");
for (i = 0, j = 4; options.code; i++) {
if ((temp = (char *)get_option(packet, options.code))) {
envp[j] = malloc(max_option_length(temp, &options) +
strlen(options.name) + 2);
fill_options(envp[j], (unsigned char *)temp, &options);
j++;
}
}
if (packet->siaddr) {
envp[j] = malloc(sizeof("siaddr=255.255.255.255"));
addr = (unsigned char *) &packet->yiaddr;
sprintf(envp[j++], "siaddr=%d.%d.%d.%d",
addr[0], addr[1], addr[2], addr[3]);
}
if (!(over & FILE_FIELD) && packet->file[0]) {
/* watch out for invalid packets */
packet->file[sizeof(packet->file) - 1] = '\0';
envp[j] = malloc(sizeof("boot_file=") + strlen((char *)(packet->file)));
sprintf(envp[j++], "boot_file=%s", packet->file);
}
if (!(over & SNAME_FIELD) && packet->sname[0]) {
/* watch out for invalid packets */
packet->sname[sizeof(packet->sname) - 1] = '\0';
envp[j] = malloc(sizeof("sname=") + strlen((char *)(packet->sname)));
sprintf(envp[j++], "sname=%s", packet->sname);
}
envp[j] = NULL;
sendEventMessage(TRUE, local_ip, subnet_ip, router_ip, dns_ip, ipv4MaskLen, ipv6PrefixLen, brAddr, ipv6rdPrefix);
return envp;
}
/* Call a script with a par file and env vars */
void run_script(struct dhcpMessage *packet, const char *name)
{
char **envp;
if (!strcmp(name, "bound"))
{
envp = fill_envp(packet);
free(*envp);
}
}
略过一些代码,大致如上了。 |
|