| .TH GET9ROOT 3 |
| .SH NAME |
| get9root, unsharp \- get path to root of Plan 9 tree |
| .SH SYNOPSIS |
| .B #include <u.h> |
| .br |
| .B #include <libc.h> |
| .PP |
| .B |
| char* get9root(void) |
| .PP |
| .B |
| char* unsharp(char *path) |
| .SH DESCRIPTION |
| This tree of Plan 9 software is conventionally installed in |
| .B \*9 |
| but may be installed in other places (for example, users without |
| the ability to write to |
| .B /usr/local |
| may with to install it in their own home directories). |
| The environment variable |
| .B $PLAN9 |
| should contain the path to the root. |
| .I Get9root |
| returns a static pointer to the pathname of root, first checking |
| .B $PLAN9 |
| and defaulting to |
| .BR \*9 . |
| .PP |
| The lack of a fixed location for the Plan 9 tree |
| makes it difficult to hard-code paths |
| to files. |
| .I Unsharp |
| replaces a leading |
| .B #9 |
| in |
| .I path |
| with the root of the tree. |
| .I Unsharp |
| also replaces a leading |
| .B #d |
| with the path to the underlying system's file descriptor dup device, |
| typically |
| .BR /dev/fd . |
| The string returned from |
| .IR unsharp , |
| if different from |
| .IR path , |
| should be freed with |
| .I free |
| (see |
| .IR malloc (3)) |
| when no longer needed. |
| .PP |
| As a convention, programs should never |
| .I unsharp |
| paths obtained from user input. |
| .SH EXAMPLE |
| The |
| .IR plumber (4) |
| uses this code to find unrooted file names included by plumb rules. |
| .IP |
| .EX |
| snprint(buf, sizeof buf, "#9/plumb/%s", name); |
| fd = open(unsharp(buf), OREAD); |
| .EE |
| .SH SOURCE |
| .B \*9/src/lib9/get9root.c |
| .br |
| .B \*9/src/lib9/unsharp.c |
| .SH SEE ALSO |
| .IR intro (4) |
| .SH BUGS |
| .I Get9root |
| could be smarter about finding the tree when |
| .B $PLAN9 |
| is not set. |