int main(int argc, char** argv) { int fd; if(argc != 2) usage(); if ((fd = open(argv[1], O_RDWR)) == -1) die("open"); size_t pagesize = sysconf(_SC_PAGE_SIZE); off_t len = fdlength(fd); if (len < pagesize) die("file to small"); size_t pages = (len/pagesize)-1; unsigned int swap[129] = {0}; // Write header. Note that older kernel versions checked signature // on disk (not in cache) during swapon, so sync after writing. swap[0] = 1; swap[1] = pages; lseek(fd, 1024, SEEK_SET); write(fd, swap, 129*sizeof(unsigned int)); lseek(fd, pagesize-10, SEEK_SET); write(fd, "SWAPSPACE2", 10); fsync(fd); close(fd); printf("Swapspace size: %luk\n", pages*(unsigned long)(pagesize/1024)); return 0; }
int readahead_main(int argc, char **argv) { int retval = EXIT_SUCCESS; if (argc == 1) bb_show_usage(); while (*++argv) { int fd = open_or_warn(*argv, O_RDONLY); if (fd >= 0) { int r = readahead(fd, 0, fdlength(fd)); close(fd); if (r >= 0) continue; } retval = EXIT_FAILURE; } return retval; }
int readahead_main(int argc, char **argv) { FILE *f; int retval = EXIT_SUCCESS; if (argc == 1) bb_show_usage(); while (*++argv) { if ((f = fopen_or_warn(*argv, "r")) != NULL) { int r, fd=fileno(f); r = readahead(fd, 0, fdlength(fd)); fclose(f); if (r >= 0) continue; } retval = EXIT_FAILURE; } return retval; }
// mknod in /dev based on a path like "/sys/block/hda/hda1" static void make_device(char *path) { char *device_name = NULL, *s, *temp; int major, minor, type, len, fd; int mode = 0660; uid_t uid = 0; gid_t gid = 0; if (path) { // Try to read major/minor string temp = strrchr(path, '/'); fd = open(path, O_RDONLY); *temp=0; temp = toybuf; len = read(fd, temp, 64); close(fd); if (len<1) return; temp[len] = 0; // Determine device type, major and minor type = path[5]=='c' ? S_IFCHR : S_IFBLK; major = minor = 0; sscanf(temp, "%u:%u", &major, &minor); } else { // if (!path), do hotplug if (!(temp = getenv("SUBSYSTEM"))) return; type = strcmp(temp, "block") ? S_IFCHR : S_IFBLK; major = minor = 0; if (!(temp = getenv("MAJOR"))) return; sscanf(temp, "%u", &major); if (!(temp = getenv("MINOR"))) return; sscanf(temp, "%u", &minor); path = getenv("DEVPATH"); device_name = getenv("DEVNAME"); if (!path) return; temp = toybuf; } if (!device_name) device_name = strrchr(path, '/') + 1; // If we have a config file, look up permissions for this device if (CFG_MDEV_CONF) { char *conf, *pos, *end; // mmap the config file if (-1!=(fd = open("/etc/mdev.conf", O_RDONLY))) { len = fdlength(fd); conf = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0); if (conf) { int line = 0; // Loop through lines in mmaped file for (pos = conf; pos-conf<len;) { int field; char *end2; line++; // find end of this line for(end = pos; end-conf<len && *end!='\n'; end++); // Three fields: regex, uid:gid, mode for (field = 3; field; field--) { // Skip whitespace while (pos<end && isspace(*pos)) pos++; if (pos==end || *pos=='#') break; for (end2 = pos; end2<end && !isspace(*end2) && *end2!='#'; end2++); switch(field) { // Regex to match this device case 3: { char *regex = strndup(pos, end2-pos); regex_t match; regmatch_t off; int result; // Is this it? xregcomp(&match, regex, REG_EXTENDED); result=regexec(&match, device_name, 1, &off, 0); regfree(&match); free(regex); // If not this device, skip rest of line if (result || off.rm_so || off.rm_eo!=strlen(device_name)) goto end_line; break; } // uid:gid case 2: { char *s2; // Find : for(s = pos; s<end2 && *s!=':'; s++); if (s==end2) goto end_line; // Parse UID uid = strtoul(pos,&s2,10); if (s!=s2) { struct passwd *pass; char *str = strndup(pos, s-pos); pass = getpwnam(str); free(str); if (!pass) goto end_line; uid = pass->pw_uid; } s++; // parse GID gid = strtoul(s,&s2,10); if (end2!=s2) { struct group *grp; char *str = strndup(s, end2-s); grp = getgrnam(str); free(str); if (!grp) goto end_line; gid = grp->gr_gid; } break; } // mode case 1: { mode = strtoul(pos, &pos, 8); if (pos!=end2) goto end_line; goto found_device; } } pos=end2; } end_line: // Did everything parse happily? if (field && field!=3) error_exit("Bad line %d", line); // Next line pos = ++end; } found_device: munmap(conf, len); } close(fd); } } sprintf(temp, "/dev/%s", device_name); if (getenv("ACTION") && !strcmp(getenv("ACTION"), "remove")) { unlink(temp); return; } if (strchr(device_name, '/')) mkpathat(AT_FDCWD, temp, 0, 2); if (mknod(temp, mode | type, makedev(major, minor)) && errno != EEXIST) perror_exit("mknod %s failed", temp); if (type == S_IFBLK) close(open(temp, O_RDONLY)); // scan for partitions if (CFG_MDEV_CONF) mode=chown(temp, uid, gid); }