source: trunk/athena/bin/attach/nfs.c @ 8843

Revision 8843, 5.4 KB checked in by ghudson, 28 years ago (diff)
BSD -> ANSI string and memory functions
Line 
1/*
2 *      $Source: /afs/dev.mit.edu/source/repository/athena/bin/attach/nfs.c,v $
3 *      $Author: ghudson $
4 *
5 *      Copyright (c) 1988 by the Massachusetts Institute of Technology.
6 */
7
8static char *rcsid_nfs_c = "$Header: /afs/dev.mit.edu/source/repository/athena/bin/attach/nfs.c,v 1.8 1996-09-19 22:13:15 ghudson Exp $";
9
10#include "attach.h"
11#ifdef NFS
12
13/* If the timeout is not explicitly specified by the attach command,
14 * it is set to 20 tenths of a second (i.e. 2 seconds).  This should
15 * really be set in the kernel, but due to release shakedown timing,
16 * it's kludged in here.
17 * Similarly with retransmissions.
18 *
19 * The kernel will double the timeout on each retry until it reaches a
20 * max of 60 seconds, at which point it uses 60 seconds for the timeout.
21 *
22 * current kernel defaults: 4 retrans, 7 tenths sec timeout.
23 * -JTK, 24 Oct 88
24 *
25 * The new values are: 6 retrans, 8 tenths sec timeout.
26 * The total timeout period is approximately 100 seconds, thus
27 * compensating for a gateway rebooting (~40 seconds).
28 * -RPB, 9 Feb 88
29 *
30 * Calculations:
31 *    total time = timeout * (2^(retrans) - 1)
32 *    [derived from sum of geometric series = a(r^n-1)/(r-1)]
33 *       a = initial timeout
34 *       r = 2
35 *       n = retrans
36 *
37 *    This holds true while timeout * 2^retrans <= 60 seconds
38 */
39
40#define TIMEO_DEFAULT   8
41#define RETRANS_DEFAULT 7
42
43nfs_attach(at, mopt, errorout)
44        struct _attachtab *at;
45        struct mntopts  *mopt;
46        int errorout;
47{
48        char fsname[BUFSIZ];
49        static char myhostname[BUFSIZ] = "";
50
51        /*
52         * Handle the 'n' mode.
53         */
54        if (at->mode == 'n') {
55                add_options(mopt, "ro");
56        }
57       
58        /*
59         * Try to figure out information about myself.  Use fsname
60         * as a temporary buffer.
61         */
62        if (!myhostname[0]) {
63                if (gethostname(myhostname, sizeof(myhostname))) {
64                        if (debug_flag)
65                                perror("gethostname");
66                }
67        }
68
69        if (myhostname[0]) {
70                if (host_compare(myhostname, at->host)) {
71                        if (!override) {
72                                fprintf(stderr,
73                                        "%s: (filesystem %s) NFS self mount not allowed.\n",
74                                        progname, at->hesiodname);
75                                error_status = ERR_ATTACHNOTALLOWED;
76                                return(FAILURE);
77                        }
78                        fprintf(stderr, "%s: (filesystem %s) warning: NFS self mount\n",
79                                progname, at->hesiodname);
80                }
81        }
82
83        if ((at->mode != 'n') && do_nfsid)
84                if (nfsid(at->host, at->hostaddr[0], MOUNTPROC_KUIDMAP,
85                          errorout, at->hesiodname, 1, owner_uid) == FAILURE) {
86                        if (mopt->flags & M_RDONLY) {
87                                printf("%s: Warning, mapping failed for filesystem %s,\n\tcontinuing with read-only mount.\n",
88                                       progname, at->hesiodname);
89                                /* So the mount rpc wins */
90                                clear_errored(at->hostaddr[0]);
91                        } else if(at->mode == 'm') {
92                                printf("%s: Warning, mapping failed for filesystem %s.\n",
93                                       progname, at->hesiodname);
94                                error_status = 0;
95                                clear_errored(at->hostaddr[0]);
96                        } else
97                                return (FAILURE);
98                }
99
100        if (!(mopt->tsa.nfs.flags & NFSMNT_RETRANS)) {
101                mopt->tsa.nfs.flags |= NFSMNT_RETRANS;
102                mopt->tsa.nfs.retrans = RETRANS_DEFAULT;
103        }
104           
105        if (!(mopt->tsa.nfs.flags & NFSMNT_TIMEO)) {
106                mopt->tsa.nfs.flags |= NFSMNT_TIMEO;
107                mopt->tsa.nfs.timeo = TIMEO_DEFAULT;
108        }
109   
110        /* XXX This is kind of bogus, because if a filesystem has a number
111         * of hesiod entries, and the mount point is busy, each one will
112         * be tried until the last one fails, then an error printed.
113         * C'est la vie.
114         */
115       
116        sprintf(fsname, "%s:%s", at->host, at->hostdir);
117
118        if (mountfs(at, fsname, mopt, errorout) == FAILURE) {
119                if ((at->mode != 'n') && do_nfsid)
120                        nfsid(at->host, at->hostaddr[0], MOUNTPROC_KUIDUMAP,
121                              errorout, at->hesiodname, 1, owner_uid);
122                return (FAILURE);
123        }
124
125        return (SUCCESS);
126}
127
128/*
129 * Detach an NFS filesystem.
130 */
131nfs_detach(at)
132    struct _attachtab *at;
133{
134        if ((at->mode != 'n') && do_nfsid &&
135            nfsid(at->host, at->hostaddr[0], MOUNTPROC_KUIDUMAP, 1,
136                  at->hesiodname,0, owner_uid) == FAILURE)
137                printf("%s: Warning: couldn't unmap filesystem %s/host %s\n",
138                       progname, at->hesiodname, at->host);
139
140        if (at->flags & FLAG_PERMANENT) {
141                if (debug_flag)
142                        printf("Permanent flag on, skipping umount.\n");
143                return(SUCCESS);
144        }
145       
146        if (nfs_unmount(at->hesiodname, at->host, at->hostaddr[0],
147                        at->mntpt, at->hostdir) == FAILURE)
148                return (FAILURE);
149   
150        return (SUCCESS);
151}
152
153/*
154 * Parsing of explicit NFS file types
155 */
156char **nfs_explicit(name)
157    char *name;
158{
159    char temp[BUFSIZ], host[BUFSIZ];
160    char *dir, *cp;
161    char newmntpt[BUFSIZ];
162    extern char *exp_hesptr[2];
163
164    filsys_type = "NFS";
165    strcpy(host, name);
166    dir = strchr(host, ':');
167    if (!dir) {
168        fprintf(stderr, "%s: Illegal explicit definition \"%s\" for type %s\n",
169                progname, name, filsys_type);
170        return (0);
171    }
172    *dir = '\0';
173    dir++;
174    if (*dir != '/') {
175        fprintf(stderr, "%s: Illegal explicit definition \"%s\" for type %s\n",
176                progname, name, filsys_type);
177        return (0);
178    }
179
180    if (!nfs_mount_dir)
181            nfs_mount_dir = strdup("");
182    if (!mntpt) {
183            strcpy(temp, host);
184            /*
185             * Zero out any domain names, since they're ugly as mount
186             * points.
187             */
188            if (cp = strchr(temp, '.'))
189                    *cp = '\0';
190            if (!strcmp(dir, "/")) {
191                    if (nfs_root_hack)
192                            sprintf(newmntpt, "%s/%s/root",
193                                    nfs_mount_dir, temp);
194                    else
195                            sprintf(newmntpt, "%s/%s", nfs_mount_dir, temp);
196            } else
197                    sprintf(newmntpt, "%s/%s%s", nfs_mount_dir, temp, dir);
198    }
199   
200    sprintf(exp_hesline, "NFS %s %s %c %s", dir, host, override_mode ?
201            override_mode : 'w',mntpt ? mntpt : newmntpt);
202    exp_hesptr[0] = exp_hesline;
203    exp_hesptr[1] = 0;
204    return (exp_hesptr);
205}
206#endif
Note: See TracBrowser for help on using the repository browser.