|  | /* Copyright (c) 2017 Facebook | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or | 
|  | * modify it under the terms of version 2 of the GNU General Public | 
|  | * License as published by the Free Software Foundation. | 
|  | */ | 
|  |  | 
|  | #include <linux/bpf.h> | 
|  | #include <linux/version.h> | 
|  | #include <bpf/bpf_helpers.h> | 
|  |  | 
|  | SEC("cgroup/dev") | 
|  | int bpf_prog1(struct bpf_cgroup_dev_ctx *ctx) | 
|  | { | 
|  | short type = ctx->access_type & 0xFFFF; | 
|  | #ifdef DEBUG | 
|  | short access = ctx->access_type >> 16; | 
|  | char fmt[] = "  %d:%d    \n"; | 
|  |  | 
|  | switch (type) { | 
|  | case BPF_DEVCG_DEV_BLOCK: | 
|  | fmt[0] = 'b'; | 
|  | break; | 
|  | case BPF_DEVCG_DEV_CHAR: | 
|  | fmt[0] = 'c'; | 
|  | break; | 
|  | default: | 
|  | fmt[0] = '?'; | 
|  | break; | 
|  | } | 
|  |  | 
|  | if (access & BPF_DEVCG_ACC_READ) | 
|  | fmt[8] = 'r'; | 
|  |  | 
|  | if (access & BPF_DEVCG_ACC_WRITE) | 
|  | fmt[9] = 'w'; | 
|  |  | 
|  | if (access & BPF_DEVCG_ACC_MKNOD) | 
|  | fmt[10] = 'm'; | 
|  |  | 
|  | bpf_trace_printk(fmt, sizeof(fmt), ctx->major, ctx->minor); | 
|  | #endif | 
|  |  | 
|  | /* Allow access to /dev/zero and /dev/random. | 
|  | * Forbid everything else. | 
|  | */ | 
|  | if (ctx->major != 1 || type != BPF_DEVCG_DEV_CHAR) | 
|  | return 0; | 
|  |  | 
|  | switch (ctx->minor) { | 
|  | case 5: /* 1:5 /dev/zero */ | 
|  | case 9: /* 1:9 /dev/urandom */ | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | char _license[] SEC("license") = "GPL"; | 
|  | __u32 _version SEC("version") = LINUX_VERSION_CODE; |