commit
5c3b7637fa
@ -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…
Reference in new issue