* GNU General Public License for more details.
*/
+#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <syslog.h>
struct blkid_struct_probe *pr = malloc(sizeof(struct blkid_struct_probe));
memset(pr, 0, sizeof(struct blkid_struct_probe));
probe_block(gl.gl_pathv[j], pr);
- if (pr->err)
+ if (pr->err || !pr->id)
free(pr);
else
list_add_tail(&pr->list, &devices);
_cache_load("/dev/mtdblock*");
_cache_load("/dev/mmcblk*");
_cache_load("/dev/sd*");
+ _cache_load("/dev/sdc*");
+ _cache_load("/dev/hd*");
+ _cache_load("/dev/md*");
+ _cache_load("/dev/mapper/*");
}
static int print_block_info(struct blkid_struct_probe *pr)
if (pr->uuid[0])
printf("\toption\tuuid\t'%s'\n", pr->uuid);
else
- printf("\toption\tdevice\t'%s'\n", basename(pr->dev));
+ printf("\toption\tdevice\t'%s'\n", pr->dev);
printf("\toption\tenabled\t'0'\n\n");
return 0;
return;
}
- if (stat(e2fsck, &statbuf) < 0)
- return;
-
- if (!(statbuf.st_mode & S_IXUSR))
+ if (stat(e2fsck, &statbuf) < 0) {
+ fprintf(stderr, "check_filesystem: %s not found\n", e2fsck);
return;
+ }
pid = fork();
if (!pid) {
exit(-1);
} else if (pid > 0) {
int status;
+
waitpid(pid, &status, 0);
+ if (WEXITSTATUS(status))
+ fprintf(stderr, "check_filesystem: %s returned %d\n", e2fsck, WEXITSTATUS(status));
}
}
static int mount_device(struct blkid_struct_probe *pr, int hotplug)
{
struct mount *m;
- char *device = basename(pr->dev);
+ char *device;
if (!pr)
return -1;
+ device = basename(pr->dev);
+
if (!strcmp(pr->id->name, "swap")) {
if (hotplug && !auto_swap)
return -1;
if (m) {
char *target = m->target;
- char _target[] = "/mnt/mmcblk123";
+ char _target[32];
int err = 0;
if (!target) {
if (!pr && delay_root){
fprintf(stderr, "extroot: is not ready yet, retrying in %ui seconds\n", delay_root);
sleep(delay_root);
+ mkblkdev();
+ cache_load(0);
pr = find_block_info(m->uuid, m->label, NULL);
}
if (pr) {
if (config_load(NULL))
return -1;
- cache_load(0);
+ cache_load(1);
list_for_each_entry(pr, &devices, list)
mount_device(pr, 0);
static int main_swapon(int argc, char **argv)
{
if (argc != 2) {
- fprintf(stderr, "Usage: swapoff [-a] [DEVICE]\n\nStop swapping on DEVICE\n\n\t-a Stop swapping on all swap devices\n");
+ fprintf(stderr, "Usage: swapon <-s> <-a> [DEVICE]\n\n\tStart swapping on [DEVICE]\n -a\tStart swapping on all swap devices\n -s\tShow summary\n");
return -1;
}
- if (!strcmp(argv[1], "-a")) {
+ if (!strcmp(argv[1], "-s")) {
+ FILE *fp = fopen("/proc/swaps", "r");
+ char *lineptr = NULL;
+ size_t s;
+
+ if (!fp) {
+ fprintf(stderr, "failed to open /proc/swaps\n");
+ return -1;
+ }
+ while (getline(&lineptr, &s, fp) > 0)
+ printf(lineptr);
+ if (lineptr)
+ free(lineptr);
+ fclose(fp);
+ } else if (!strcmp(argv[1], "-a")) {
struct blkid_struct_probe *pr;
cache_load(0);
struct stat s;
int err;
- if (stat(argv[1], &s) || !S_ISBLK(s.st_mode)) {
- fprintf(stderr, "%s is not a block device\n", argv[1]);
+ if (stat(argv[1], &s) || (!S_ISBLK(s.st_mode) && !S_ISREG(s.st_mode))) {
+ fprintf(stderr, "%s is not a block device or file\n", argv[1]);
return -1;
}
err = swapon(argv[1], 0);
static int main_swapoff(int argc, char **argv)
{
if (argc != 2) {
- fprintf(stderr, "Usage: swapoff [-a] [DEVICE]\n\nStop swapping on DEVICE\n\n\t-a Stop swapping on all swap devices\n");
+ fprintf(stderr, "Usage: swapoff [-a] [DEVICE]\n\n\tStop swapping on DEVICE\n -a\tStop swapping on all swap devices\n");
return -1;
}
struct stat s;
int err;
- if (stat(argv[1], &s) || !S_ISBLK(s.st_mode)) {
- fprintf(stderr, "%s is not a block device\n", argv[1]);
+ if (stat(argv[1], &s) || (!S_ISBLK(s.st_mode) && !S_ISREG(s.st_mode))) {
+ fprintf(stderr, "%s is not a block device or file\n", argv[1]);
return -1;
}
err = swapoff(argv[1]);