+static const int bmap[] = {
+ -1,
+ -1, -1, 2, -1, 3, -1, 4, 14, -1, 15, 17, 18, 27, -1, 22, 23, -1, 24, 10, -1,
+ 9, 25, 11, 8, -1, 7, -1, -1, 5, -1, 6, 12, 13, -1, 19, 16, 21, 20, -1, 21,
+};
+static const int imap[] = {
+ -1, -1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
+ 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, 27,
+};
+static const int *umap = bmap;
+static int mapn = sizeof(bmap) / sizeof(*bmap);
+static int preserve = 0;
+
+static int mappin(int num)
+{
+ if((num < 0) || (num >= mapn))
+ return(-1);
+ return(umap[num]);
+}
+
+static void export(int p)
+{
+ char path[256];
+ FILE *fp;
+ int rp;
+
+ if((rp = mappin(p)) < 0)
+ errx(1, "%i: no such port", p);
+ sprintf(path, "/sys/class/gpio/gpio%i", rp);
+ if(!access(path, R_OK | X_OK))
+ return;
+ if(preserve)
+ errx(2, "gpio%i: not exported", rp);
+ sprintf(path, "/sys/class/gpio/export");
+ if((fp = fopen(path, "w")) == NULL)
+ err(1, "%s", path);
+ fprintf(fp, "%i\n", rp); fflush(fp);
+ if(ferror(fp))
+ errx(1, "gpio%i: could not export", rp);
+ fclose(fp);
+ sprintf(path, "/sys/class/gpio/gpio%i", rp);
+ if(access(path, R_OK | X_OK))
+ errx(1, "gpio%i: still not available after export", rp);
+}
+
+static void checkdir(int rp, char *dir)