vol: Tidy header includes
[openafs.git] / src / vol / devname.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 #include <roken.h>
14
15 #include <rx/xdr.h>
16 #include <afs/afsint.h>
17 #include <ctype.h>
18
19 #if !defined(AFS_SGI_ENV)
20 #ifdef  AFS_OSF_ENV
21 #include <ufs/fs.h>
22 #else /* AFS_OSF_ENV */
23 #ifdef AFS_VFSINCL_ENV
24 #define VFS
25 #ifdef  AFS_SUN5_ENV
26 #include <sys/fs/ufs_fs.h>
27 #else
28 #if defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
29 #include <ufs/ufs/dinode.h>
30 #include <ufs/ffs/fs.h>
31 #else
32 #include <ufs/fs.h>
33 #endif
34 #endif
35 #else /* AFS_VFSINCL_ENV */
36 #if !defined(AFS_AIX_ENV) && !defined(AFS_LINUX20_ENV) && !defined(AFS_XBSD_ENV) && !defined(AFS_ARM_DARWIN_ENV)
37 #include <sys/fs.h>
38 #endif
39 #endif /* AFS_VFSINCL_ENV */
40 #endif /* AFS_OSF_ENV */
41 #endif /* AFS_SGI_ENV */
42 #include <sys/file.h>
43 #ifdef  AFS_AIX_ENV
44 #include <sys/vfs.h>
45 #else
46 #ifdef  AFS_HPUX_ENV
47 #include <mntent.h>
48 #else
49 #if     defined(AFS_SUN_ENV) || defined(AFS_SUN5_ENV)
50 #ifdef  AFS_SUN5_ENV
51 #include <sys/mnttab.h>
52 #include <sys/mntent.h>
53 #else
54 #include <mntent.h>
55 #endif
56 #else
57 #if defined(AFS_SGI_ENV)
58 #include <mntent.h>
59 #else
60 #ifdef AFS_LINUX22_ENV
61 #include <mntent.h>
62 #else
63 #include <fstab.h>
64 #endif
65 #endif
66 #endif /* AFS_SGI_ENV */
67 #endif /* AFS_HPUX_ENV */
68 #endif
69 #include <sys/wait.h>
70 #include <setjmp.h>
71
72 #include "ihandle.h"
73 #include "partition.h"
74
75 /* ensure that we don't have a "/" instead of a "/dev/rxd0a" type of device.
76  * returns pointer to static storage; copy it out quickly!
77  */
78 char *
79 vol_DevName(dev_t adev, char *wpath)
80 {
81     static char pbuffer[128];
82     char pbuf[128], *ptr;
83 #ifdef  AFS_SUN5_ENV
84     struct mnttab mnt;
85     FILE *mntfile;
86 #else
87 #if defined(AFS_SGI_ENV) || defined(AFS_SUN_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_LINUX22_ENV)
88     struct mntent *mntent;
89     FILE *mfd;
90 #else
91     struct fstab *fsent;
92 #endif
93 #endif
94 #ifdef  AFS_AIX_ENV
95     int nmounts;
96     struct vmount *vmountp;
97 #endif
98
99 #ifdef  AFS_AIX_ENV
100     if ((nmounts = getmount(&vmountp)) <= 0) {
101         return NULL;
102     }
103     for (; nmounts;
104          nmounts--, vmountp =
105          (struct vmount *)((int)vmountp + vmountp->vmt_length)) {
106         char *part = vmt2dataptr(vmountp, VMT_STUB);
107 #else
108 #ifdef  AFS_SUN5_ENV
109     if (!(mntfile = fopen(MNTTAB, "r"))) {
110         return NULL;
111     }
112     while (!getmntent(mntfile, &mnt)) {
113         char *part = mnt.mnt_mountp;
114 #else
115 #if defined(AFS_SGI_ENV) || defined(AFS_SUN_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_LINUX22_ENV)
116 #ifdef AFS_LINUX22_ENV
117     if ((mfd = setmntent("/proc/mounts", "r")) == NULL) {
118         if ((mfd = setmntent("/etc/mtab", "r")) == NULL) {
119             return NULL;
120         }
121     }
122 #else
123     if ((mfd = setmntent(MOUNTED /*MNTTAB*/, "r")) == NULL) {
124         return NULL;
125     }
126 #endif
127     while ((mntent = getmntent(mfd))) {
128         char *part = mntent->mnt_dir;
129 #else
130     setfsent();
131     while ((fsent = getfsent())) {
132         char *part = fsent->fs_file;
133 #endif
134 #endif /* AFS_SGI_ENV */
135 #endif
136         struct stat status;
137 #ifdef  AFS_AIX_ENV
138         if (vmountp->vmt_flags & (MNT_READONLY | MNT_REMOVABLE | MNT_REMOTE))
139             continue;           /* Ignore any "special" partitions */
140 #else
141 #ifdef  AFS_SUN5_ENV
142         /* Ignore non ufs or non read/write partitions */
143         if ((strcmp(mnt.mnt_fstype, "ufs") != 0)
144             || (strncmp(mnt.mnt_mntopts, "ro,ignore", 9) == 0))
145             continue;
146 #else
147 #if defined(AFS_LINUX22_ENV)
148         if (strcmp(mntent->mnt_type, "ext2"))
149             continue;
150 #else
151 #if defined(AFS_SGI_ENV) || defined(AFS_SUN_ENV) || defined(AFS_HPUX_ENV)
152         if (!hasmntopt(mntent, MNTOPT_RW))
153             continue;
154 #else
155         if (strcmp(fsent->fs_type, "rw") != 0)
156             continue;           /* Ignore non read/write partitions */
157 #endif /* AFS_LINUX22_ENV */
158 #endif /* AFS_SGI_ENV */
159 #endif
160 #endif
161         /* Only keep track of "/vicepx" partitions since it can get hairy when NFS mounts are involved.. */
162         if (strncmp(part, VICE_PARTITION_PREFIX, VICE_PREFIX_SIZE)) {
163             continue;           /* Non /vicepx; ignore */
164         }
165         if (stat(part, &status) == -1) {
166             continue;
167         }
168 #if !defined(AFS_SGI_XFS_IOPS_ENV) && !defined(AFS_LINUX22_ENV) && !defined(AFS_ARM_DARWIN_ENV)
169         if ((status.st_ino !=
170              ROOTINO) /*|| ((status.st_mode & S_IFMT) != S_IFBLK) */ ) {
171             continue;
172         }
173 #endif
174         if (status.st_dev == adev) {
175 #ifdef  AFS_AIX_ENV
176             strcpy(pbuffer, vmt2dataptr(vmountp, VMT_OBJECT));
177 #else
178 #ifdef  AFS_SUN5_ENV
179             strcpy(pbuffer, mnt.mnt_special);
180 #else
181 #if defined(AFS_SGI_ENV) || defined(AFS_SUN_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_LINUX22_ENV)
182             strcpy(pbuffer, mntent->mnt_fsname);
183 #else
184             strcpy(pbuffer, fsent->fs_spec);
185 #endif
186 #endif /* AFS_SGI_ENV */
187 #endif
188             if (wpath) {
189                 strcpy(pbuf, pbuffer);
190                 ptr = (char *)strrchr(pbuf, OS_DIRSEPC);
191                 if (ptr) {
192                     *ptr = '\0';
193                     strcpy(wpath, pbuf);
194                 } else
195                     return NULL;
196             }
197             ptr = (char *)strrchr(pbuffer, OS_DIRSEPC);
198             if (ptr) {
199                 strcpy(pbuffer, ptr + 1);
200                 return pbuffer;
201             } else
202                 return NULL;
203         }
204     }
205 #ifdef  AFS_SUN5_ENV
206     (void)fclose(mntfile);
207 #else
208 #if defined(AFS_SGI_ENV) || defined(AFS_SUN_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_LINUX22_ENV)
209     endmntent(mfd);
210 #else
211 #ifndef AFS_AIX_ENV
212     endfsent();
213 #endif
214 #endif
215 #endif /* AFS_SGI_ENV */
216     return NULL;
217 }
218
219 /* Search for the raw device name. Will put an "r" in front of each
220  * directory and file entry of the pathname until we find a character
221  * device.
222  */
223 char *
224 afs_rawname(char *devfile)
225 {
226     static char rawname[100];
227     struct stat statbuf;
228     int code, i;
229
230     i = strlen(devfile);
231     while (i >= 0) {
232         strcpy(rawname, devfile);
233         if (devfile[i] == OS_DIRSEPC) {
234             rawname[i + 1] = 'r';
235             rawname[i + 2] = 0;
236             strcat(rawname, &devfile[i + 1]);
237         }
238
239         code = stat(rawname, &statbuf);
240         if (!code && S_ISCHR(statbuf.st_mode))
241             return rawname;
242
243         while ((--i >= 0) && (devfile[i] != OS_DIRSEPC));
244     }
245
246     return NULL;
247 }