blob: 3c979840f4f157962467465b197d9c05ff17ac85 [file] [log] [blame]
"Robert P. J. Day"63fc1a92006-07-02 19:47:05 +00001/* vi: set sw=4 ts=4: */
Matt Kraai83788da2002-03-20 17:38:37 +00002/*
3 * Mini losetup implementation for busybox
4 *
5 * Copyright (C) 2002 Matt Kraai.
6 *
Bernhard Reutner-Fischer4a1865c2006-01-13 18:11:59 +00007 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
Matt Kraai83788da2002-03-20 17:38:37 +00008 */
9
10#include <getopt.h>
11#include <stdlib.h>
12
13#include "busybox.h"
14
Rob Landley1d589b22005-11-29 23:47:10 +000015int losetup_main (int argc, char **argv)
Matt Kraai83788da2002-03-20 17:38:37 +000016{
Matt Kraai83788da2002-03-20 17:38:37 +000017 int offset = 0;
Matt Kraai83788da2002-03-20 17:38:37 +000018
Rob Landley6a6798b2005-08-10 20:35:54 +000019 /* This will need a "while(getopt()!=-1)" loop when we can have more than
20 one option, but for now we can't. */
21 switch(getopt(argc,argv, "do:")) {
22 case 'd':
23 /* detach takes exactly one argument */
Rob Landleyce887932005-12-21 17:00:25 +000024 if(optind+1!=argc) bb_show_usage();
25 if(!del_loop(argv[optind])) return EXIT_SUCCESS;
Rob Landley1d589b22005-11-29 23:47:10 +000026die_failed:
27 bb_perror_msg_and_die("%s",argv[optind]);
Matt Kraai83788da2002-03-20 17:38:37 +000028
Rob Landley6a6798b2005-08-10 20:35:54 +000029 case 'o':
Bernhard Reutner-Fischer4a1865c2006-01-13 18:11:59 +000030 offset = bb_xparse_number (optarg, NULL);
Rob Landley6a6798b2005-08-10 20:35:54 +000031 /* Fall through to do the losetup */
32 case -1:
33 /* losetup takes two argument:, loop_device and file */
Rob Landley1d589b22005-11-29 23:47:10 +000034 if(optind+2==argc) {
Tim Rikerc1ef7bd2006-01-25 00:08:53 +000035 if(set_loop(&argv[optind], argv[optind + 1], offset)>=0)
36 return EXIT_SUCCESS;
37 else goto die_failed;
Rob Landley1d589b22005-11-29 23:47:10 +000038 }
39 if(optind+1==argc) {
Tim Rikerc1ef7bd2006-01-25 00:08:53 +000040 char *s=query_loop(argv[optind]);
41 if (!s) goto die_failed;
42 printf("%s: %s\n",argv[optind],s);
43 if(ENABLE_FEATURE_CLEAN_UP) free(s);
44 return EXIT_SUCCESS;
Rob Landley1d589b22005-11-29 23:47:10 +000045 }
Rob Landley6a6798b2005-08-10 20:35:54 +000046 break;
47 }
48 bb_show_usage();
49 return EXIT_FAILURE;
Matt Kraai83788da2002-03-20 17:38:37 +000050}