mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 06:58:22 +00:00
socket: SIOCSIFADDR ioctl
This commit is contained in:
@@ -64,6 +64,21 @@ int sockfs_setattr(vnode_t *node, vattr_t *attr, cred_t *cred) {
|
|||||||
// arg can be in userspace
|
// arg can be in userspace
|
||||||
int sockfs_ioctl(vnode_t *node, unsigned long request, void *arg, int *result) {
|
int sockfs_ioctl(vnode_t *node, unsigned long request, void *arg, int *result) {
|
||||||
switch (request) {
|
switch (request) {
|
||||||
|
case SIOCSIFADDR:
|
||||||
|
{
|
||||||
|
ifreq_t *ifreq = arg;
|
||||||
|
netdev_t *netdev = netdev_getdev(ifreq->name);
|
||||||
|
if(netdev) {
|
||||||
|
sockaddr_t sockaddr;
|
||||||
|
int e = sock_convertaddress(&sockaddr, &ifreq->addr);
|
||||||
|
if (e)
|
||||||
|
return e;
|
||||||
|
netdev->ip = sockaddr.ipv4addr.addr;
|
||||||
|
} else {
|
||||||
|
return ENODEV;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case SIOCGIFHWADDR:
|
case SIOCGIFHWADDR:
|
||||||
{
|
{
|
||||||
ifreq_t *ifreq = arg;
|
ifreq_t *ifreq = arg;
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ typedef struct {
|
|||||||
#define IFNAMSIZ 16
|
#define IFNAMSIZ 16
|
||||||
#define SIOCGIFHWADDR 0x8927
|
#define SIOCGIFHWADDR 0x8927
|
||||||
#define SIOCADDRT 0x890b
|
#define SIOCADDRT 0x890b
|
||||||
|
#define SIOCSIFADDR 0x8916
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char name[IFNAMSIZ];
|
char name[IFNAMSIZ];
|
||||||
|
|||||||
@@ -17,6 +17,9 @@
|
|||||||
#ifndef SIOCADDRT
|
#ifndef SIOCADDRT
|
||||||
#define SIOCADDRT 0x890B
|
#define SIOCADDRT 0x890B
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef SIOCSIFADDR
|
||||||
|
#define SIOCSIFADDR 0x8916
|
||||||
|
#endif
|
||||||
|
|
||||||
#define DHCPHDR_TYPE_CLIENT 1
|
#define DHCPHDR_TYPE_CLIENT 1
|
||||||
#define DHCPHDR_TYPE_SERVER 2
|
#define DHCPHDR_TYPE_SERVER 2
|
||||||
@@ -406,6 +409,19 @@ static void addroute(char *device, uint32_t addr, uint32_t gateway, uint32_t mas
|
|||||||
logstrerror("failed to add route");
|
logstrerror("failed to add route");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setifip(char *device, uint32_t addr) {
|
||||||
|
// get hardware address of device
|
||||||
|
struct ifreq buffer = {0};
|
||||||
|
strcpy(buffer.ifr_name, device);
|
||||||
|
|
||||||
|
struct sockaddr_in *sockaddr = (struct sockaddr_in *)&buffer.ifr_addr;
|
||||||
|
sockaddr->sin_family = AF_INET;
|
||||||
|
sockaddr->sin_addr.s_addr = htonl(addr);
|
||||||
|
|
||||||
|
if (ioctl(sockfd, SIOCSIFADDR, &buffer))
|
||||||
|
logstrerror("failed to set device ip address");
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
name = argv[0];
|
name = argv[0];
|
||||||
|
|
||||||
@@ -469,6 +485,7 @@ int main(int argc, char *argv[]) {
|
|||||||
|
|
||||||
addroute(argv[1], 0, offer.router, 0, 1);
|
addroute(argv[1], 0, offer.router, 0, 1);
|
||||||
addroute(argv[1], offer.clientip, 0, offer.netmask, 10);
|
addroute(argv[1], offer.clientip, 0, offer.netmask, 10);
|
||||||
|
setifip(argv[1], offer.clientip);
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user