1
0
Files
2022-09-29 17:59:04 +03:00

252 lines
5.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/dir.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <syslog.h>
#include <sys/syssgi.h>
#include "dhcp_common.h"
extern char *InterfaceHostName;
extern u_long InterfaceAddr;
extern int InterfaceNum;
static void
write_config_file(char *fname, char *ftype, char *str)
{
FILE *fp;
fp = fopen(fname, ftype);
fputs(str, fp);
fclose(fp);
}
static int
update_ifconfig_options(int ifnum, u_long s_mask)
{
char fname[64];
char fname1[64];
FILE *fp, *fp1;
char inbuf[256];
char *otype = "netmask";
int found = 0;
char outbuf1[256];
char outbuf2[256];
char *p, *q, *s;
int len, tlen, n, pt;
tlen = strlen(otype);
sprintf(fname, "/etc/config/ifconfig-%d.options", ifnum);
if(access(fname, 0)) { /* File does not exist */
fp = fopen(fname, "w");
if(!fp) return 1;
fprintf(fp, "%s 0x%x\n", otype, s_mask);
fclose(fp);
}
else { /* File Exists */
bzero(inbuf, 256);
fp = fopen(fname, "r");
if(!fp)
return 1;
sprintf(fname1, "%s.tmp", fname);
fp1 = fopen(fname1, "w");
if(!fp1)
return 1;
while (fgets(inbuf, 256, fp) != NULL) {
if (q = strstr(inbuf, otype)) { /* found */
p =inbuf;
len = strlen(inbuf);
if(inbuf[len-1] == '\n') {
inbuf[len-1] = '\0';
len--;
}
found = 1;
pt = q-p+tlen; /* upto "netmask" */
strncpy(outbuf1, p, pt);
outbuf1[pt] = '\0';
sprintf(outbuf2, "%s 0x%x", outbuf1, s_mask); /* new mask */
q += (tlen+1);
n = strspn(q, " \t");
q += n;
n = strcspn(q, " \t\0"); /* upto space after the mask */
q += n;
if(*q == '\0')
fprintf(fp1, "%s\n", outbuf2);
else
fprintf(fp1, "%s%s\n", outbuf2, q);
}
else {
fprintf(fp1, "%s", inbuf);
}
}
if (!found)
fprintf(fp1, "%s 0x%x\n", otype, s_mask);
fclose(fp);
fclose(fp1);
if (rename(fname1, fname) == -1) {
syslog(LOG_ERR, "Rename error %s to %s", fname1, fname);
return 1;
}
}
return 0;
}
int
dhc0_setupTheConfiguration(char *hsname, u_long ipaddr, char *eaddr,
u_long smask, char *sname, u_long saddr,
u_long sdist_addr, char *nisdm,int start_nis,
char *dnsdm)
{
char *ipchar = 0;
char *serv_ipchar = 0;
char *sdist_ipchar = 0;
char *etheraddr;
struct ether_addr ead;
struct in_addr ipn, ipz;
int rval;
char commandbuf[256];
char arg1[128], arg2[128];
bcopy(eaddr, ead.ea_addr, 6);
etheraddr = ether_ntoa(&ead);
ipn.s_addr = ipaddr;
ipchar = strdup(inet_ntoa(ipn));
if(saddr) {
ipn.s_addr = saddr;
serv_ipchar = strdup(inet_ntoa(ipn));
}
if(sdist_addr) {
ipn.s_addr = sdist_addr;
sdist_ipchar = strdup(inet_ntoa(ipn));
}
rval = sys0_removeFromHostsFile(InterfaceAddr);
if(rval) {
ipz.s_addr = InterfaceAddr;
syslog(LOG_ERR, "Error removing entry for host %s from the hosts file.",
inet_ntoa(ipz) );
}
if (dnsdm != 0)
rval = sys0_addToHostsFile(ipaddr, hsname, dnsdm);
else if (start_nis)
rval = sys0_addToHostsFile(ipaddr, hsname, nisdm);
else
rval = sys0_addToHostsFile(ipaddr, hsname, (char*)0);
if(rval) {
syslog(LOG_ERR, "Error adding entry for host %s to the hosts file.",
hsname);
exit(1);
}
if( sname && *sname && (gethostbyname(sname) == NULL) ) {
if (dnsdm != 0)
rval = sys0_addToHostsFile(saddr, sname, dnsdm);
else if (start_nis)
rval = sys0_addToHostsFile(saddr, sname, nisdm);
else
rval = sys0_addToHostsFile(saddr, sname, (char*)0);
if(rval) {
syslog(LOG_ERR,
"Warning: Cannot add entry for server %s to hosts file.",
sname);
}
}
/* This first removes the old entry */
rval = sys0_addToEthersFile(&ead, hsname);
if(rval) {
syslog(LOG_ERR, "Error adding entry for host %s to the ethers file.",
hsname);
}
/* Check if the smask is non default, if so save it in the
* ifconfig.options file.
*/
/* smask : check if primary interface, or interface number specified */
if(smask)
update_ifconfig_options(InterfaceNum, smask);
chmod("/.rhosts", 0600);
if(sdist_ipchar) {
sprintf(commandbuf, "%s\n", sdist_ipchar);
write_config_file("/.rhosts", "a", commandbuf);
}
if(InterfaceNum == 1) {
sprintf(commandbuf, "%s\n", hsname);
write_config_file("/etc/sys_id", "w", commandbuf);
sethostid(ipaddr);
sethostname(hsname, strlen(hsname));
strcpy(arg1, "netaddr");
strcpy(arg2, ipchar);
syssgi(SGI_SETNVRAM, arg1, arg2);
}
sprintf(commandbuf, "/etc/chkconfig network on");
system(commandbuf);
if( (InterfaceNum == 1) && start_nis) {
if(nisdm && *nisdm) {
sprintf(commandbuf, "%s\n", nisdm);
write_config_file("/usr/etc/yp/ypdomain", "w", commandbuf);
/* YP Client configed with nsd under 6.5 */
/*
* sprintf(commandbuf, "/etc/chkconfig yp on");
* system(commandbuf);
*/
}
sprintf(commandbuf, "/etc/chkconfig nfs on");
system(commandbuf);
}
sprintf(commandbuf, "/etc/init.d/network stop");
rval = system(commandbuf);
/* This is nsd specific and required only for 6.5 release */
sprintf(commandbuf, "/sbin/rm -rf /ns/.local/hosts*");
rval = system(commandbuf);
sprintf(commandbuf, "/etc/init.d/network start");
rval = system(commandbuf);
InterfaceAddr = ipaddr;
if(InterfaceHostName)
free(InterfaceHostName);
InterfaceHostName = strdup(hsname);
if(ipchar)
free(ipchar);
if(saddr && serv_ipchar)
free(serv_ipchar);
if(sdist_addr && sdist_ipchar)
free(sdist_ipchar);
return 0;
}
int
dhc0_shutdownNetwork()
{
char commandbuf[256];
int rval;
sprintf(commandbuf, "/etc/chkconfig network off");
system(commandbuf);
sprintf(commandbuf, "/etc/init.d/network stop");
rval = system(commandbuf);
sprintf(commandbuf, "/etc/init.d/network start");
system(commandbuf);
return 0;
}