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