xref: /illumos-gate/usr/src/lib/libvolmgt/common/volmgt.c (revision 3d393ee6c37fa10ac512ed6d36109ad616dc7c1a)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #pragma ident	"%Z%%M%	%I%	%E% SMI"
27 
28 #include	<stdio.h>
29 #include	<string.h>
30 #include	<dirent.h>
31 #include	<fcntl.h>
32 #include	<string.h>
33 #include	<errno.h>
34 #include	<limits.h>
35 #include	<unistd.h>
36 #include	<sys/mkdev.h>
37 #include	<volmgt.h>
38 #include	<ctype.h>
39 #include	<sys/types.h>
40 #include	<sys/stat.h>
41 #include	<sys/param.h>
42 #include	"volmgt_private.h"
43 
44 /*
45  * arc approved interface
46  *	- can not be modified without approval from an arc
47  *
48  * committment level:
49  *	public
50  *
51  * description:
52  *	volmgt_running: check to see if volume management is running.
53  *
54  * arguments:
55  *	none.
56  *
57  * return value(s):
58  *	TRUE if volume management is running, FALSE if not.
59  *
60  * preconditions:
61  *	none.
62  */
63 int
64 volmgt_running(void)
65 {
66 	/* vold is dead */
67 	return (FALSE);
68 }
69 
70 
71 /*
72  * arc approved interface
73  *	- can not be modified without approval from an arc
74  *
75  * committment level:
76  *	public
77  *
78  * description:
79  *	volmgt_inuse: check to see if volume management is currently
80  *	managing a particular device.
81  *
82  * arguments:
83  *	path - the name of the device in /dev.  For example,
84  *	  "/dev/rdiskette".
85  *
86  * return value(s):
87  *	TRUE if volume management is managing the device, FALSE if not.
88  *
89  * preconditions:
90  *	none.
91  */
92 /* ARGSUSED */
93 int
94 volmgt_inuse(char *path)
95 {
96 	return (FALSE);
97 }
98 
99 
100 /*
101  * arc approved interface
102  *	- can not be modified without approval from an arc
103  *
104  * committment level:
105  *	public
106  *
107  * description:
108  *	volmgt_check: have volume management look at its devices to check
109  *	for media having arrived.  Since volume management can't
110  *	automatically check all types of devices, this function is provided
111  *	to allow applications to cause the check to happen automatically.
112  *
113  * arguments:
114  *	path - the name of the device in /dev.  For example,
115  *	  /dev/rdiskette.  If path is NULL, all "checkable" devices are
116  *	  checked.
117  *
118  * return value(s):
119  *	TRUE if media was found in the device, FALSE if not.
120  *
121  * preconditions:
122  *	volume management must be running.
123  */
124 /* ARGSUSED */
125 int
126 volmgt_check(char *path)
127 {
128 	return (FALSE);
129 }
130 
131 
132 /*
133  * arc approved interface
134  *	- can not be modified without approval from an arc
135  *
136  * committment level:
137  *	public
138  *
139  * description:
140  *	volmgt_ownspath: check to see if the given path is contained in
141  *	the volume management name space.
142  *
143  * arguments:
144  *	path - string containing the path.
145  *
146  * return value(s):
147  *	TRUE if the path is owned by volume management, FALSE if not.
148  *	Will return FALSE if volume management isn't running.
149  *
150  * preconditions:
151  *	none.
152  */
153 /* ARGSUSED */
154 int
155 volmgt_ownspath(char *path)
156 {
157 	return (FALSE);
158 }
159 
160 
161 /*
162  * arc approved interface
163  *	- can not be modified without approval from an arc
164  *
165  * committment level:
166  *	public
167  *
168  * description:
169  *	volmgt_root: return the root of where the volume management
170  *	name space is mounted.
171  *
172  * arguments:
173  *	none.
174  *
175  * return value(s):
176  *	Returns a pointer to a static string containing the path to the
177  *	volume management root (e.g. "/vol").
178  *	Will return NULL if volume management isn't running.
179  *
180  * preconditions:
181  *	none.
182  */
183 const char *
184 volmgt_root(void)
185 {
186 	static const char *vold_root = "/dev";
187 
188 	return (vold_root);
189 }
190 
191 
192 /*
193  * arc approved interface
194  *	- can not be modified without approval from an arc
195  *
196  * committment level:
197  *	public
198  *
199  * description:
200  *	volmgt_symname: Returns the volume management symbolic name
201  *	for a given device.  If an application wants to determine
202  *	what the symbolic name (e.g. "floppy0") for the /dev/rdiskette
203  *	device would be, this is the function to use.
204  *
205  * arguments:
206  *	path - a string containing the /dev device name.  For example,
207  *	"/dev/diskette" or "/dev/rdiskette".
208  *
209  *	Note: must be a block- or char-spcl device, and have a non-zero
210  *	st_rdev (real device) stat() value.
211  *
212  * return value(s):
213  *	pointer to a string containing the symbolic name.
214  *
215  *	NULL indicates that volume management isn't managing that device.
216  *
217  *	The string must be free(3)'d.
218  *
219  * preconditions:
220  *	none.
221  */
222 /* ARGSUSED */
223 char *
224 volmgt_symname(char *path)
225 {
226 	return (NULL);
227 }
228 
229 
230 /*
231  * arc approved interface
232  *	- can not be modified without approval from an arc
233  *
234  * committment level:
235  *	public
236  *
237  * description:
238  *	volmgt_symdev: Returns the device given the volume management
239  *	symbolic name. If an application wants to determine
240  *	what the device associated with a particular symbolic name
241  *	might be, this is the function to use.
242  *
243  * arguments:
244  *	path - a string containing the symbolic device name.  For example,
245  *	"cdrom0" or "floppy0".
246  *
247  * return value(s):
248  *	pointer to a string containing the /dev name.
249  *
250  *	NULL indicates that volume management isn't managing that device.
251  *
252  *	The string must be free(3)'d.
253  *
254  * preconditions:
255  *	none.
256  */
257 /* ARGSUSED */
258 char *
259 volmgt_symdev(char *symname)
260 {
261 	return (NULL);
262 }
263 
264 
265 /*
266  * arc approved interface
267  *	- can not be modified without approval from an arc
268  *
269  * committment level:
270  *	public
271  *
272  * description:
273  *	volmgt_feat_enabled: check to see if a volume management feature
274  *	is available
275  *
276  * arguments:
277  *	feat_str - a string containing the feature to be checked for
278  *
279  * return value(s):
280  *	return non-zero if the specified feature is available in
281  *	volume management, else return zero
282  *
283  * preconditions:
284  *	none.
285  */
286 
287 
288 /*
289  * the following is a lit of the "feature" available in volmgt
290  *
291  * this list is meant to be updated when new features (that users may
292  * want to use) are added to volmgt
293  *
294  * note: feature strings added should be all lower case, and spaces are
295  * discouraged
296  *
297  * (see psarc/1995/138 for more info)
298  */
299 static char	*volmgt_feat_list[] = {
300 #ifdef	DIRECT_DEV_ACCESS_WORKING
301 	"direct-dev-access",		/* access through /dev co-exists */
302 #endif
303 	"floppy-summit-interfaces",	/* volmgt_{acquire,release} */
304 	NULL
305 };
306 
307 
308 int
309 volmgt_feature_enabled(char *feat_str)
310 {
311 	return (0);
312 }
313 /*
314  * arc approved interface
315  *	- can not be modified without approval from an arc
316  *
317  * committment level:
318  *	uncommitted
319  *
320  * description:
321  *	volmgt_acquire: try to acquire the volmgt advisory device reservation
322  *	for a specific device.
323  *
324  * arguments:
325  *	dev - a device name to attempt reserving.  This string can be:
326  *		- a full path name to a device
327  *		- a symbolic device name (e.g. floppy0)
328  *
329  *	id  - a reservation string that hopefully describes the application
330  *		making this reservation.
331  *
332  *	pid - a pointer to a pid_t type.  If this argument is not NULL
333  *		and the requested device is already reserved, the process
334  *		id of the reservation owner will be returned in this
335  *		location.
336  *
337  *	ovr - an override indicator.  If set to non-zero, the caller requests
338  *		that this reservation be made unconditionally.
339  *
340  *	err - the address of a pointer to a string which is to receive the
341  *		id argument used when the current device was reserved.  This
342  *		is only used when the current reservation attempt fails due
343  *		to an already existing reservation for this device.
344  *
345  * return value(s):
346  *	A non-zero indicator if successful.
347  *
348  *	A zero indicator if unsuccessful.  If errno is EBUSY, then the err
349  *	argument will be set to point to the string that the process currently
350  *	holding the reservation supplied when reserving the device.  It is up
351  *	to the caller to release the storage occupied by the string via
352  *	free(3C) when no longer needed.
353  *
354  * preconditions:
355  *	none
356  */
357 /* ARGSUSED */
358 int
359 volmgt_acquire(char *dev, char *id, int ovr, char **err, pid_t *pidp)
360 {
361 	return (0);
362 }
363 
364 
365 /*
366  * arc approved interface
367  *	- can not be modified without approval from an arc
368  *
369  * committment level:
370  *	uncommitted
371  *
372  * description:
373  *	volmgt_release: try to release the volmgt advisory device reservation
374  *	for a specific device.
375  *
376  * arguments:
377  *	dev - a device name to attempt reserving.  This string can be:
378  *		- a full path name to a device
379  *		- a symbolic device name (e.g. floppy0)
380  *
381  * return value(s):
382  *	A non-zero indicator if successful
383  *	A zero indicator if unsuccessful
384  *
385  * preconditions:
386  *	none
387  */
388 int
389 volmgt_release(char *dev)
390 {
391 	return (0);
392 }
393 
394 
395 /*
396  * returns the "value" of the attribute.
397  * If the attribute is boolean and is TRUE,
398  * "true" is returned.  If the boolean is
399  * FALSE, NULL is returned.  If the attribute
400  * doesn't exist, NULL is returned.  The pointer
401  * returned by media_getattr has been malloc'd and
402  * it is the callers responsibility to free it.
403  */
404 /*
405  * arc approved interface
406  *	- can not be modified without approval from an arc
407  *
408  * committment level:
409  *	public
410  *
411  * description:
412  *	media_getattr: returns the value for an attribute for a piece of
413  * 	removable media.
414  *
415  * arguments:
416  *	path - Path to the media in /vol.  Can be the block or character
417  *		device.
418  *
419  *	attr - name of the attribute.
420  *
421  * return value(s):
422  *	returns NULL or a pointer to a string that contains the value for
423  * 	the requested attribute.
424  *
425  *	NULL can mean:
426  *	 - the media doesn't exist
427  *	 - there is no more space for malloc(3)
428  *	 - the attribute doesn't exist for the named media
429  *	 - the attribute is a boolean and is FALSE
430  *
431  *	the pointer to the string must be free'd with free(3).
432  *
433  * preconditions:
434  *	volume management (vold) must be running.
435  */
436 /* ARGSUSED */
437 char *
438 media_getattr(char *vol_path, char *attr)
439 {
440 	return (NULL);
441 }
442 
443 
444 /*
445  * sets the attribute "attr" to value "value".
446  *
447  * If value == "" the flag is
448  * considered to be a TRUE boolean.
449  *
450  * If value == 0, it is considered to be a FALSE boolean.
451  * returns TRUE on success, FALSE on failure.
452  *
453  * Can fail for reasons of permission, or if you
454  * write a read-only attribute.
455  */
456 
457 /*
458  * arc approved interface
459  *	- can not be modified without approval from an arc
460  *
461  * committment level:
462  *	public
463  *
464  * description:
465  *	media_setattr: set an attribute for a piece of media to a
466  *	particular value.
467  *
468  * arguments:
469  *	path - Path to the media in /vol.  Can be the block or character
470  *		device.
471  *
472  *	attr - name of the attribute.
473  *
474  *	value - value of the attribute.  If value == "", the flag is
475  *		considered to be a boolean that is TRUE.  If value == 0, it
476  *		is considered to be a FALSE boolean.
477  *
478  * return value(s):
479  *	TRUE on success, FALSE for failure.
480  *
481  *	Can fail because:
482  *		- don't have permission to set the attribute because caller
483  *		  is not the owner of the media and attribute is a "system"
484  *		  attribute.
485  *
486  *		- don't have permission to set the attribute because the
487  *		  attribute is a "system" attribute and is read-only.
488  *
489  * preconditions:
490  *	volume management must be running.
491  */
492 /* ARGSUSED */
493 int
494 media_setattr(char *vol_path, char *attr, char *value)
495 {
496 	return (FALSE);
497 }
498 
499 
500 /*
501  * Returns the "id" of a volume.  If the returned value
502  * & VOLID_TMP, the volume is temporary and this value
503  * cannot be relied upon across reboots.
504  */
505 /*
506  * arc approved interface
507  *	- can not be modified without approval from an arc
508  *
509  * committment level:
510  *	public
511  *
512  * description:
513  *	media_getid: return the "id" of a piece of media.
514  *
515  * arguments:
516  *	path - Path to the media in /vol.  Can be the block or character
517  *		device.
518  * return value(s):
519  *	returns a u_longlong_t that is the "id" of the volume.
520  *
521  * preconditions:
522  *	volume management must be running.
523  */
524 u_longlong_t
525 media_getid(char *vol_path)
526 {
527 	return (0);
528 }
529 /*
530  * arc approved interface (pending)
531  *	- can not be modified without approval from an arc
532  *
533  * committment level:
534  *	public
535  *
536  * description:
537  *	media_findname: try to come up with the character device when
538  *	provided with a starting point.  This interface provides the
539  *	application programmer to provide "user friendly" names and
540  *	easily determine the "/vol" name.
541  *
542  * arguments:
543  *	start - a string describing a device.  This string can be:
544  *		- a full path name to a device (insures it's a
545  *		  character device by using getfullrawname()).
546  *		- a full path name to a volume management media name
547  *		  with partitions (will return the lowest numbered
548  *		  raw partition.
549  *		- the name of a piece of media (e.g. "fred").
550  *		- a symbolic device name (e.g. floppy0, cdrom0, etc)
551  *		- a name like "floppy" or "cdrom".  Will pick the lowest
552  *		  numbered device with media in it.
553  *
554  * return value(s):
555  *	A pointer to a string that contains the character device
556  *	most appropriate to the "start" argument.
557  *
558  *	NULL indicates that we were unable to find media based on "start".
559  *
560  *	The string must be free(3)'d.
561  *
562  * preconditions:
563  *	none.
564  */
565 /* ARGSUSED */
566 char *
567 media_findname(char *start)
568 {
569 	/*
570 	 * Eventually should implement using HAL interfaces.
571 	 * In the short term however, return NULL for aliases,
572 	 * and self for absolute pathnames.
573 	 */
574 	if (start[0] == '/') {
575 		return (strdup(start));
576 	} else {
577 		return (NULL);
578 	}
579 }
580 
581 struct alias {
582 	char	*alias;
583 	char	*name;
584 };
585 
586 /*
587  * "old" aliases -- used to be used when vold wasn't running
588  */
589 static struct alias device_aliases[] = {
590 	{ "fd", "/dev/rdiskette" },
591 	{ "fd0", "/dev/rdiskette" },
592 	{ "fd1", "/dev/rdiskette1" },
593 	{ "diskette", "/dev/rdiskette" },
594 	{ "diskette0", "/dev/rdiskette0" },
595 	{ "diskette1", "/dev/rdiskette1" },
596 	{ "rdiskette", "/dev/rdiskette" },
597 	{ "rdiskette0", "/dev/rdiskette0" },
598 	{ "rdiskette1", "/dev/rdiskette1" },
599 	{ "floppy", "/dev/rdiskette" },
600 	{ "floppy0", "/dev/rdiskette0" },
601 	{ "floppy1", "/dev/rdiskette1" },
602 	{ "cd", "cdrom0" },
603 	{ "cd0", "cdrom0" },
604 	{ "cd1", "cdrom1" },
605 	{ NULL, NULL }
606 };
607 
608 /*
609  * This is an ON Consolidation Private interface.
610  */
611 /* ARGSUSED */
612 char *
613 _media_oldaliases(char *start)
614 {
615 	struct alias	*s;
616 	char		*p;
617 	char		*res = NULL;
618 
619 	for (s = device_aliases; s->alias != NULL; s++) {
620 		if (strcmp(start, s->alias) == 0) {
621 			res = strdup(s->name);
622 			break;
623 		}
624 	}
625 
626 	return (res);
627 }
628 
629 
630 /*
631  * This is an ON Consolidation Private interface.
632  *
633  * Print out the aliases available to the program user.  Changes
634  * depending in whether volume management is running.
635  */
636 void
637 _media_printaliases(void)
638 {
639 }
640