Initial commit

master
Baltazár Radics 1 year ago
commit 5c3b7637fa

@ -0,0 +1,3 @@
all: serial2mac
clean: ; rm -fv serial2mac

@ -0,0 +1,23 @@
# Maintainer: Baltazár Radics <baltazar.radics@gmail.com>
pkgname=serial2mac
pkgver=1.0
pkgrel=1
pkgdesc='Sets mac address based on cpu serial number'
arch=(armv7h)
url=
license=(MIT)
depends=(glibc)
source=(Makefile $pkgname.c $pkgname.rules)
noextract=()
sha256sums=('b65d82482f4e2a5af2da3cece9a034e9a19c07a92149c774c2da75d07340f086'
'73acb463a7e9b8bf432b92d184194bcb086dcabbbf85dc9614c8dcf61a2a55b3'
'8332f739d99ec9e262be1a24ae1a3d708ef9214b9c29334cea36d1202d96d758')
build() {
make
}
package() {
install -Dm755 $pkgname "$pkgdir/usr/bin/$pkgname"
install -Dm644 $pkgname.rules "$pkgdir/usr/lib/udev/rules.d/75-$pkgname.rules"
}

@ -0,0 +1,49 @@
#include <net/if.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
unsigned char get_byte(FILE *fp) {
unsigned char ret = 0;
for (int i = 0; i < 2; ++i) {
int c = getc(fp);
if (c == EOF)
perror("getc"), exit(1);
c = c > '9' ? c - 'a' + 0xa : c - '0' + 0x0;
if (c > 0xf)
fputs("unexpected char in serial number\n", stderr), exit(1);
ret <<= 4;
ret |= c;
}
return ret;
}
int main(int argc, char *argv[]) {
if (argc != 2)
fputs("Expected a single argument.\n", stderr), exit(1);
struct ifreq dev;
strcpy(dev.ifr_name, argv[1]);
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock < 0)
perror("socket"), exit(1);
if (ioctl(sock, SIOCGIFHWADDR, &dev) < 0)
perror("get hwaddr ioctl"), exit(1);
FILE *fp = fopen("/sys/firmware/devicetree/base/serial-number", "r");
if (!fp)
perror("serial-number fopen"), exit(1);
dev.ifr_hwaddr.sa_data[0] = get_byte(fp);
if (fseek(fp, 4, SEEK_CUR))
perror("fseek"), exit(1);
for (uint i = 1; i < 6; ++i)
dev.ifr_hwaddr.sa_data[i] = get_byte(fp);
if (ioctl(sock, SIOCSIFHWADDR, &dev) < 0)
perror("set hwaddr ioctl"), exit(1);
}

@ -0,0 +1 @@
ACTION=="add", SUBSYSTEM=="net", ATTR{type}=="1", RUN+="/usr/bin/serial2mac $name"
Loading…
Cancel
Save