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