xref: /openbsd/sbin/mount_udf/mount_udf.c (revision b7041c07)
1 /*	$OpenBSD: mount_udf.c,v 1.9 2021/10/24 21:24:22 deraadt Exp $	*/
2 
3 /*
4  * Copyright (c) 2005 Pedro Martelletto <pedro@ambientworks.net>
5  * All rights reserved.
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #include <sys/types.h>
21 #include <sys/mount.h>
22 #include <sys/ioctl.h>
23 #include <sys/cdio.h>
24 
25 #include <err.h>
26 #include <fcntl.h>
27 #include <unistd.h>
28 #include <limits.h>
29 #include <stdlib.h>
30 #include <stdio.h>
31 
32 #include "mntopts.h"
33 
34 const struct mntopt opts[] = { MOPT_STDOPTS, { NULL } };
35 
36 u_int32_t lastblock(char *dev);
37 __dead void usage(void);
38 
39 
40 __dead void
usage(void)41 usage(void)
42 {
43 	extern char *__progname;
44 
45 	fprintf(stderr, "usage: %s [-o options] special node\n", __progname);
46 
47 	exit(EXIT_FAILURE);
48 }
49 
50 /* Find out media's last block by looking at the LBA of the lead-out track. */
51 u_int32_t
lastblock(char * dev)52 lastblock(char *dev)
53 {
54 	int fd, error;
55 	struct ioc_read_toc_entry t;
56 	struct cd_toc_entry te;
57 
58 	fd = open(dev, O_RDONLY);
59 	if (fd == -1)
60 		err(1, "open");
61 
62 	t.address_format = CD_LBA_FORMAT;
63 	t.starting_track = CD_TRACK_LEADOUT;
64 	t.data_len = sizeof(struct cd_toc_entry);
65 	t.data = &te;
66 
67 	error = ioctl(fd, CDIOREADTOCENTRIES, &t);
68 
69 	close(fd);
70 
71 	return (error == -1 ? 0 : te.addr.lba);
72 }
73 
74 int
main(int argc,char ** argv)75 main(int argc, char **argv)
76 {
77 	struct udf_args args;
78 	char node[PATH_MAX];
79 	int ch, flags = 0;
80 
81 	while ((ch = getopt(argc, argv, "o:")) != -1)
82 		switch (ch) {
83 		case 'o':
84 			getmntopts(optarg, opts, &flags);
85 			break;
86 		default:
87 			usage();
88 		}
89 
90 	argc -= optind;
91 	argv += optind;
92 
93 	if (argc != 2)
94 		usage();
95 
96 	args.fspec = argv[0];
97 	args.lastblock = lastblock(argv[0]);
98 
99 	if (realpath(argv[1], node) == NULL)
100 		err(1, "realpath %s", argv[1]);
101 
102 	if (mount(MOUNT_UDF, node, flags, &args) == -1)
103 		err(1, "mount");
104 
105 	exit(0);
106 }
107