138494Sobrien/*
2310490Scy * Copyright (c) 1997-2014 Erez Zadok
338494Sobrien * Copyright (c) 1989 Jan-Simon Pendry
438494Sobrien * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
538494Sobrien * Copyright (c) 1989 The Regents of the University of California.
638494Sobrien * All rights reserved.
738494Sobrien *
838494Sobrien * Redistribution and use in source and binary forms, with or without
938494Sobrien * modification, are permitted provided that the following conditions
1038494Sobrien * are met:
1138494Sobrien * 1. Redistributions of source code must retain the above copyright
1238494Sobrien *    notice, this list of conditions and the following disclaimer.
1338494Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1438494Sobrien *    notice, this list of conditions and the following disclaimer in the
1538494Sobrien *    documentation and/or other materials provided with the distribution.
16310490Scy * 3. Neither the name of the University nor the names of its contributors
1738494Sobrien *    may be used to endorse or promote products derived from this software
1838494Sobrien *    without specific prior written permission.
1938494Sobrien *
2038494Sobrien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2138494Sobrien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2238494Sobrien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2338494Sobrien * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2438494Sobrien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2538494Sobrien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2638494Sobrien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2738494Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2838494Sobrien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2938494Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3038494Sobrien * SUCH DAMAGE.
3138494Sobrien *
3238494Sobrien *
33174294Sobrien * File: am-utils/fsinfo/fsi_util.c
3438494Sobrien *
3538494Sobrien */
3638494Sobrien
3738494Sobrien#ifdef HAVE_CONFIG_H
3838494Sobrien# include <config.h>
3938494Sobrien#endif /* HAVE_CONFIG_H */
4038494Sobrien#include <am_defs.h>
4138494Sobrien#include <fsi_data.h>
4238494Sobrien#include <fsinfo.h>
4338494Sobrien
4438494Sobrien/* static variables */
4538494Sobrienstatic int show_range = 10;
4638494Sobrienstatic int col = 0;
4738494Sobrienstatic int total_shown = 0;
4838494Sobrienstatic int total_mmm = 8;
4938494Sobrien
5038494Sobrien
5138494Sobrienstatic int
5238494Sobriencol_output(int len)
5338494Sobrien{
5438494Sobrien  int wrapped = 0;
5538494Sobrien
5638494Sobrien  col += len;
5738494Sobrien  if (col > 77) {
5838494Sobrien    fputc('\n', stdout);
5938494Sobrien    col = len;
6038494Sobrien    wrapped = 1;
6138494Sobrien  }
6238494Sobrien  return wrapped;
6338494Sobrien}
6438494Sobrien
6538494Sobrien
6638494Sobrienstatic void
6738494Sobrienshow_total(void)
6838494Sobrien{
6938494Sobrien  if (total_mmm != -show_range + 1) {
7038494Sobrien    char n[8];
7138494Sobrien    int len;
7238494Sobrien
7338494Sobrien    if (total_mmm < 0)
7438494Sobrien      fputc('*', stdout);
75174294Sobrien    xsnprintf(n, sizeof(n), "%d", total_shown);
7638494Sobrien    len = strlen(n);
7738494Sobrien    if (col_output(len))
7838494Sobrien      fputc(' ', stdout);
7938494Sobrien    fputs(n, stdout);
8038494Sobrien    fflush(stdout);
8138494Sobrien    total_mmm = -show_range;
8238494Sobrien  }
8338494Sobrien}
8438494Sobrien
8538494Sobrien
8638494Sobrienvoid
8738494Sobriencol_cleanup(int eoj)
8838494Sobrien{
8938494Sobrien  if (verbose < 0)
9038494Sobrien    return;
9138494Sobrien  if (eoj) {
9238494Sobrien    show_total();
9338494Sobrien    fputs(")]", stdout);
9438494Sobrien  }
9538494Sobrien  if (col) {
9638494Sobrien    fputc('\n', stdout);
9738494Sobrien    col = 0;
9838494Sobrien  }
9938494Sobrien}
10038494Sobrien
10138494Sobrien
10238494Sobrien/*
10338494Sobrien * Lots of ways of reporting errors...
10438494Sobrien */
10538494Sobrienvoid
10638494Sobrienerror(char *fmt, ...)
10738494Sobrien{
10838494Sobrien  va_list ap;
10938494Sobrien
11038494Sobrien  va_start(ap, fmt);
11138494Sobrien  col_cleanup(0);
11238494Sobrien  fprintf(stderr, "%s: Error, ", progname);
11382794Sobrien  vfprintf(stderr, fmt, ap);
11438494Sobrien  fputc('\n', stderr);
11538494Sobrien  errors++;
11638494Sobrien  va_end(ap);
11738494Sobrien}
11838494Sobrien
11938494Sobrien
12038494Sobrienvoid
12138494Sobrienlerror(ioloc *l, char *fmt, ...)
12238494Sobrien{
12338494Sobrien  va_list ap;
12438494Sobrien
12538494Sobrien  va_start(ap, fmt);
12638494Sobrien  col_cleanup(0);
12738494Sobrien  fprintf(stderr, "%s:%d: ", l->i_file, l->i_line);
12882794Sobrien  vfprintf(stderr, fmt, ap);
12938494Sobrien  fputc('\n', stderr);
13038494Sobrien  errors++;
13138494Sobrien  va_end(ap);
13238494Sobrien}
13338494Sobrien
13438494Sobrien
13538494Sobrienvoid
13638494Sobrienlwarning(ioloc *l, char *fmt, ...)
13738494Sobrien{
13838494Sobrien  va_list ap;
13938494Sobrien
14038494Sobrien  va_start(ap, fmt);
14138494Sobrien  col_cleanup(0);
14238494Sobrien  fprintf(stderr, "%s:%d: ", l->i_file, l->i_line);
14382794Sobrien  vfprintf(stderr, fmt, ap);
14438494Sobrien  fputc('\n', stderr);
14538494Sobrien  va_end(ap);
14638494Sobrien}
14738494Sobrien
14838494Sobrien
14938494Sobrienvoid
15038494Sobrienfatal(char *fmt, ...)
15138494Sobrien{
15238494Sobrien  va_list ap;
15338494Sobrien
15438494Sobrien  va_start(ap, fmt);
15538494Sobrien  col_cleanup(1);
15638494Sobrien  fprintf(stderr, "%s: Fatal, ", progname);
15782794Sobrien  vfprintf(stderr, fmt, ap);
15838494Sobrien  fputc('\n', stderr);
15938494Sobrien  va_end(ap);
16038494Sobrien  exit(1);
16138494Sobrien}
16238494Sobrien
16338494Sobrien
16438494Sobrien/*
16538494Sobrien * Debug log
16638494Sobrien */
16738494Sobrienvoid
168119679Smbrfsi_log(char *fmt, ...)
16938494Sobrien{
17038494Sobrien  va_list ap;
17138494Sobrien
17238494Sobrien  if (verbose > 0) {
17338494Sobrien    va_start(ap, fmt);
17438494Sobrien    fputc('#', stdout);
17538494Sobrien    fprintf(stdout, "%s: ", progname);
17682794Sobrien    vfprintf(stdout, fmt, ap);
17738494Sobrien    putc('\n', stdout);
17838494Sobrien    va_end(ap);
17938494Sobrien  }
18038494Sobrien}
18138494Sobrien
18238494Sobrien
18338494Sobrienvoid
18438494Sobrieninfo_hdr(FILE *ef, char *info)
18538494Sobrien{
18638494Sobrien  fprintf(ef, "# *** NOTE: This file contains %s info\n", info);
18738494Sobrien}
18838494Sobrien
18938494Sobrien
19038494Sobrienvoid
19138494Sobriengen_hdr(FILE *ef, char *hn)
19238494Sobrien{
19338494Sobrien  fprintf(ef, "# *** NOTE: Only for use on %s\n", hn);
19438494Sobrien}
19538494Sobrien
19638494Sobrien
19738494Sobrienstatic void
19838494Sobrienmake_banner(FILE *fp)
19938494Sobrien{
200310490Scy  time_t t = time((time_t *) NULL);
20138494Sobrien  char *cp = ctime(&t);
20238494Sobrien
20338494Sobrien  fprintf(fp,
20438494Sobrien	  "\
20538494Sobrien# *** This file was automatically generated -- DO NOT EDIT HERE ***\n\
20638494Sobrien# \"%s\" run by %s@%s on %s\
20738494Sobrien#\n\
20838494Sobrien",
20938494Sobrien	  progname, username, hostname, cp);
21038494Sobrien}
21138494Sobrien
21238494Sobrien
21338494Sobrienvoid
21438494Sobrienshow_new(char *msg)
21538494Sobrien{
21638494Sobrien  if (verbose < 0)
21738494Sobrien    return;
21838494Sobrien
21938494Sobrien  total_shown++;
22038494Sobrien  if (total_mmm > show_range) {
22138494Sobrien    show_total();
22238494Sobrien  } else if (total_mmm == 0) {
22338494Sobrien    fputc('*', stdout);
22438494Sobrien    fflush(stdout);
22538494Sobrien    col += 1;
22638494Sobrien  }
22738494Sobrien  total_mmm++;
22838494Sobrien}
22938494Sobrien
23038494Sobrien
23138494Sobrienvoid
23238494Sobrienshow_area_being_processed(char *area, int n)
23338494Sobrien{
234310490Scy  static char *last_area = NULL;
23538494Sobrien
23638494Sobrien  if (verbose < 0)
23738494Sobrien    return;
23838494Sobrien  if (last_area) {
23938494Sobrien    if (total_shown)
24038494Sobrien      show_total();
24138494Sobrien    fputs(")", stdout);
24238494Sobrien    col += 1;
24338494Sobrien  }
24438494Sobrien
24538494Sobrien  if (!last_area || !STREQ(area, last_area)) {
24638494Sobrien    if (last_area) {
24738494Sobrien      col_cleanup(0);
24838494Sobrien      total_shown = 0;
24938494Sobrien      total_mmm = show_range + 1;
25038494Sobrien    }
25138494Sobrien    (void) col_output(strlen(area) + 2);
25238494Sobrien    fprintf(stdout, "[%s", area);
25338494Sobrien    last_area = area;
25438494Sobrien  }
25538494Sobrien
25638494Sobrien  fputs(" (", stdout);
25738494Sobrien  col += 2;
25838494Sobrien  show_range = n;
25938494Sobrien  total_mmm = n + 1;
26038494Sobrien
26138494Sobrien  fflush(stdout);
26238494Sobrien}
26338494Sobrien
26438494Sobrien
26538494Sobrien/*
26638494Sobrien * Open a file with the given prefix and name
26738494Sobrien */
26838494SobrienFILE *
26938494Sobrienpref_open(char *pref, char *hn, void (*hdr) (FILE *, char *), char *arg)
27038494Sobrien{
27138494Sobrien  char p[MAXPATHLEN];
27238494Sobrien  FILE *ef;
27338494Sobrien
274174294Sobrien  xsnprintf(p, sizeof(p), "%s%s", pref, hn);
275119679Smbr  fsi_log("Writing %s info for %s to %s", pref, hn, p);
27638494Sobrien  ef = fopen(p, "w");
27738494Sobrien  if (ef) {
27838494Sobrien    (*hdr) (ef, arg);
27938494Sobrien    make_banner(ef);
28038494Sobrien  } else {
28138494Sobrien    error("can't open %s for writing", p);
28238494Sobrien  }
28338494Sobrien
28438494Sobrien  return ef;
28538494Sobrien}
28638494Sobrien
28738494Sobrien
28838494Sobrienint
28938494Sobrienpref_close(FILE *fp)
29038494Sobrien{
29138494Sobrien  return fclose(fp) == 0;
29238494Sobrien}
29338494Sobrien
29438494Sobrien
29538494Sobrien/*
29638494Sobrien * Determine where Amd would automount the host/volname pair
29738494Sobrien */
29838494Sobrienvoid
299174294Sobriencompute_automount_point(char *buf, size_t l, host *hp, char *vn)
30038494Sobrien{
301174294Sobrien  xsnprintf(buf, l, "%s/%s%s", autodir, hp->h_lochost, vn);
30238494Sobrien}
30338494Sobrien
30438494Sobrien
30538494Sobrien/*
30638494Sobrien * Data constructors..
30738494Sobrien */
30838494Sobrienautomount *
30938494Sobriennew_automount(char *name)
31038494Sobrien{
31138494Sobrien  automount *ap = CALLOC(struct automount);
31238494Sobrien
31338494Sobrien  ap->a_ioloc = current_location();
31438494Sobrien  ap->a_name = name;
315310490Scy  ap->a_volname = NULL;
316310490Scy  ap->a_mount = NULL;
317310490Scy  ap->a_opts = NULL;
31838494Sobrien  show_new("automount");
31938494Sobrien  return ap;
32038494Sobrien}
32138494Sobrien
32238494Sobrien
32338494Sobrienauto_tree *
32438494Sobriennew_auto_tree(char *def, qelem *ap)
32538494Sobrien{
32638494Sobrien  auto_tree *tp = CALLOC(struct auto_tree);
32738494Sobrien
32838494Sobrien  tp->t_ioloc = current_location();
32938494Sobrien  tp->t_defaults = def;
33038494Sobrien  tp->t_mount = ap;
33138494Sobrien  show_new("auto_tree");
33238494Sobrien  return tp;
33338494Sobrien}
33438494Sobrien
33538494Sobrien
33638494Sobrienhost *
33738494Sobriennew_host(void)
33838494Sobrien{
33938494Sobrien  host *hp = CALLOC(struct host);
34038494Sobrien
34138494Sobrien  hp->h_ioloc = current_location();
34238494Sobrien  hp->h_mask = 0;
34338494Sobrien  show_new("host");
34438494Sobrien  return hp;
34538494Sobrien}
34638494Sobrien
34738494Sobrien
34838494Sobrienvoid
34938494Sobrienset_host(host *hp, int k, char *v)
35038494Sobrien{
35138494Sobrien  int m = 1 << k;
35238494Sobrien
35338494Sobrien  if (hp->h_mask & m) {
354310490Scy    fsi_error("host field \"%s\" already set", host_strings[k]);
35538494Sobrien    return;
35638494Sobrien  }
35738494Sobrien  hp->h_mask |= m;
35838494Sobrien
35938494Sobrien  switch (k) {
36038494Sobrien
36138494Sobrien  case HF_HOST:{
362310490Scy      char *p = xstrdup(v);
36338494Sobrien      dict_ent *de = dict_locate(dict_of_hosts, v);
36438494Sobrien
36538494Sobrien      if (de)
366310490Scy	fsi_error("duplicate host %s!", v);
36738494Sobrien      else
36838494Sobrien	dict_add(dict_of_hosts, v, (char *) hp);
36938494Sobrien      hp->h_hostname = v;
37038494Sobrien      domain_strip(p, hostname);
37138494Sobrien      if (strchr(p, '.') != 0)
37238494Sobrien	XFREE(p);
37338494Sobrien      else
37438494Sobrien	hp->h_lochost = p;
37538494Sobrien    }
37638494Sobrien    break;
37738494Sobrien
37838494Sobrien  case HF_CONFIG:{
37938494Sobrien      qelem *q;
38038494Sobrien      qelem *vq = (qelem *) v;
38138494Sobrien
38238494Sobrien      hp->h_mask &= ~m;
38338494Sobrien      if (hp->h_config)
38438494Sobrien	q = hp->h_config;
38538494Sobrien      else
38638494Sobrien	q = hp->h_config = new_que();
38738494Sobrien      ins_que(vq, q->q_back);
38838494Sobrien    }
38938494Sobrien    break;
39038494Sobrien
39138494Sobrien  case HF_ETHER:{
39238494Sobrien      qelem *q;
39338494Sobrien      qelem *vq = (qelem *) v;
39438494Sobrien
39538494Sobrien      hp->h_mask &= ~m;
39638494Sobrien      if (hp->h_ether)
39738494Sobrien	q = hp->h_ether;
39838494Sobrien      else
39938494Sobrien	q = hp->h_ether = new_que();
40038494Sobrien      ins_que(vq, q->q_back);
40138494Sobrien    }
40238494Sobrien    break;
40338494Sobrien
40438494Sobrien  case HF_ARCH:
40538494Sobrien    hp->h_arch = v;
40638494Sobrien    break;
40738494Sobrien
40838494Sobrien  case HF_OS:
40938494Sobrien    hp->h_os = v;
41038494Sobrien    break;
41138494Sobrien
41238494Sobrien  case HF_CLUSTER:
41338494Sobrien    hp->h_cluster = v;
41438494Sobrien    break;
41538494Sobrien
41638494Sobrien  default:
41738494Sobrien    abort();
41838494Sobrien    break;
41938494Sobrien  }
42038494Sobrien}
42138494Sobrien
42238494Sobrien
42338494Sobrienether_if *
42438494Sobriennew_ether_if(void)
42538494Sobrien{
42638494Sobrien  ether_if *ep = CALLOC(struct ether_if);
42738494Sobrien
42838494Sobrien  ep->e_mask = 0;
42938494Sobrien  ep->e_ioloc = current_location();
43038494Sobrien  show_new("ether_if");
43138494Sobrien  return ep;
43238494Sobrien}
43338494Sobrien
43438494Sobrien
43538494Sobrienvoid
43638494Sobrienset_ether_if(ether_if *ep, int k, char *v)
43738494Sobrien{
43838494Sobrien  int m = 1 << k;
43938494Sobrien
44038494Sobrien  if (ep->e_mask & m) {
441310490Scy    fsi_error("netif field \"%s\" already set", ether_if_strings[k]);
44238494Sobrien    return;
44338494Sobrien  }
44438494Sobrien  ep->e_mask |= m;
44538494Sobrien
44638494Sobrien  switch (k) {
44738494Sobrien
44838494Sobrien  case EF_INADDR:{
44938494Sobrien      ep->e_inaddr.s_addr = inet_addr(v);
450174294Sobrien      if ((int) ep->e_inaddr.s_addr == (int) INADDR_NONE)
451310490Scy	fsi_error("malformed IP dotted quad: %s", v);
45238494Sobrien      XFREE(v);
45338494Sobrien    }
45438494Sobrien    break;
45538494Sobrien
45638494Sobrien  case EF_NETMASK:{
45738494Sobrien      u_long nm = 0;
45838494Sobrien
45938494Sobrien      if ((sscanf(v, "0x%lx", &nm) == 1 || sscanf(v, "%lx", &nm) == 1) && nm != 0)
46038494Sobrien	ep->e_netmask = htonl(nm);
46138494Sobrien      else
462310490Scy	fsi_error("malformed netmask: %s", v);
46338494Sobrien      XFREE(v);
46438494Sobrien    }
46538494Sobrien    break;
46638494Sobrien
46738494Sobrien  case EF_HWADDR:
46838494Sobrien    ep->e_hwaddr = v;
46938494Sobrien    break;
47038494Sobrien
47138494Sobrien  default:
47238494Sobrien    abort();
47338494Sobrien    break;
47438494Sobrien  }
47538494Sobrien}
47638494Sobrien
47738494Sobrien
47838494Sobrienvoid
47938494Sobrienset_disk_fs(disk_fs *dp, int k, char *v)
48038494Sobrien{
48138494Sobrien  int m = 1 << k;
48238494Sobrien
48338494Sobrien  if (dp->d_mask & m) {
484310490Scy    fsi_error("fs field \"%s\" already set", disk_fs_strings[k]);
48538494Sobrien    return;
48638494Sobrien  }
48738494Sobrien  dp->d_mask |= m;
48838494Sobrien
48938494Sobrien  switch (k) {
49038494Sobrien
49138494Sobrien  case DF_FSTYPE:
49238494Sobrien    dp->d_fstype = v;
49338494Sobrien    break;
49438494Sobrien
49538494Sobrien  case DF_OPTS:
49638494Sobrien    dp->d_opts = v;
49738494Sobrien    break;
49838494Sobrien
49938494Sobrien  case DF_DUMPSET:
50038494Sobrien    dp->d_dumpset = v;
50138494Sobrien    break;
50238494Sobrien
50338494Sobrien  case DF_LOG:
50438494Sobrien    dp->d_log = v;
50538494Sobrien    break;
50638494Sobrien
50738494Sobrien  case DF_PASSNO:
50838494Sobrien    dp->d_passno = atoi(v);
50938494Sobrien    XFREE(v);
51038494Sobrien    break;
51138494Sobrien
51238494Sobrien  case DF_FREQ:
51338494Sobrien    dp->d_freq = atoi(v);
51438494Sobrien    XFREE(v);
51538494Sobrien    break;
51638494Sobrien
51738494Sobrien  case DF_MOUNT:
51838494Sobrien    dp->d_mount = &((fsi_mount *) v)->m_q;
51938494Sobrien    break;
52038494Sobrien
52138494Sobrien  default:
52238494Sobrien    abort();
52338494Sobrien    break;
52438494Sobrien  }
52538494Sobrien}
52638494Sobrien
52738494Sobrien
52838494Sobriendisk_fs *
52938494Sobriennew_disk_fs(void)
53038494Sobrien{
53138494Sobrien  disk_fs *dp = CALLOC(struct disk_fs);
53238494Sobrien
53338494Sobrien  dp->d_ioloc = current_location();
53438494Sobrien  show_new("disk_fs");
53538494Sobrien  return dp;
53638494Sobrien}
53738494Sobrien
53838494Sobrien
53938494Sobrienvoid
54038494Sobrienset_mount(fsi_mount *mp, int k, char *v)
54138494Sobrien{
54238494Sobrien  int m = 1 << k;
54338494Sobrien
54438494Sobrien  if (mp->m_mask & m) {
545310490Scy    fsi_error("mount tree field \"%s\" already set", mount_strings[k]);
54638494Sobrien    return;
54738494Sobrien  }
54838494Sobrien  mp->m_mask |= m;
54938494Sobrien
55038494Sobrien  switch (k) {
55138494Sobrien
55238494Sobrien  case DM_VOLNAME:
55338494Sobrien    dict_add(dict_of_volnames, v, (char *) mp);
55438494Sobrien    mp->m_volname = v;
55538494Sobrien    break;
55638494Sobrien
55738494Sobrien  case DM_EXPORTFS:
55838494Sobrien    mp->m_exportfs = v;
55938494Sobrien    break;
56038494Sobrien
56138494Sobrien  case DM_SEL:
56238494Sobrien    mp->m_sel = v;
56338494Sobrien    break;
56438494Sobrien
56538494Sobrien  default:
56638494Sobrien    abort();
56738494Sobrien    break;
56838494Sobrien  }
56938494Sobrien}
57038494Sobrien
57138494Sobrien
57238494Sobrienfsi_mount *
57338494Sobriennew_mount(void)
57438494Sobrien{
57538494Sobrien  fsi_mount *fp = CALLOC(struct fsi_mount);
57638494Sobrien
57738494Sobrien  fp->m_ioloc = current_location();
57838494Sobrien  show_new("mount");
57938494Sobrien  return fp;
58038494Sobrien}
58138494Sobrien
58238494Sobrien
58338494Sobrienvoid
58438494Sobrienset_fsmount(fsmount *fp, int k, char *v)
58538494Sobrien{
58638494Sobrien  int m = 1 << k;
58738494Sobrien
58838494Sobrien  if (fp->f_mask & m) {
589310490Scy    fsi_error("mount field \"%s\" already set", fsmount_strings[k]);
59038494Sobrien    return;
59138494Sobrien  }
59238494Sobrien  fp->f_mask |= m;
59338494Sobrien
59438494Sobrien  switch (k) {
59538494Sobrien
59638494Sobrien  case FM_LOCALNAME:
59738494Sobrien    fp->f_localname = v;
59838494Sobrien    break;
59938494Sobrien
60038494Sobrien  case FM_VOLNAME:
60138494Sobrien    fp->f_volname = v;
60238494Sobrien    break;
60338494Sobrien
60438494Sobrien  case FM_FSTYPE:
60538494Sobrien    fp->f_fstype = v;
60638494Sobrien    break;
60738494Sobrien
60838494Sobrien  case FM_OPTS:
60938494Sobrien    fp->f_opts = v;
61038494Sobrien    break;
61138494Sobrien
61238494Sobrien  case FM_FROM:
61338494Sobrien    fp->f_from = v;
61438494Sobrien    break;
61538494Sobrien
61638494Sobrien  case FM_DIRECT:
61738494Sobrien    break;
61838494Sobrien
61938494Sobrien  default:
62038494Sobrien    abort();
62138494Sobrien    break;
62238494Sobrien  }
62338494Sobrien}
62438494Sobrien
62538494Sobrien
62638494Sobrienfsmount *
62738494Sobriennew_fsmount(void)
62838494Sobrien{
62938494Sobrien  fsmount *fp = CALLOC(struct fsmount);
63038494Sobrien
63138494Sobrien  fp->f_ioloc = current_location();
63238494Sobrien  show_new("fsmount");
63338494Sobrien  return fp;
63438494Sobrien}
63538494Sobrien
63638494Sobrien
63738494Sobrienvoid
63838494Sobrieninit_que(qelem *q)
63938494Sobrien{
64038494Sobrien  q->q_forw = q->q_back = q;
64138494Sobrien}
64238494Sobrien
64338494Sobrien
64438494Sobrienqelem *
64538494Sobriennew_que(void)
64638494Sobrien{
64738494Sobrien  qelem *q = CALLOC(qelem);
64838494Sobrien
64938494Sobrien  init_que(q);
65038494Sobrien  return q;
65138494Sobrien}
65238494Sobrien
65338494Sobrien
65438494Sobrienvoid
65538494Sobrienins_que(qelem *elem, qelem *pred)
65638494Sobrien{
65738494Sobrien  qelem *p;
65838494Sobrien
65938494Sobrien  p = pred->q_forw;
66038494Sobrien  elem->q_back = pred;
66138494Sobrien  elem->q_forw = p;
66238494Sobrien  pred->q_forw = elem;
66338494Sobrien  p->q_back = elem;
66438494Sobrien}
66538494Sobrien
66638494Sobrien
66738494Sobrienvoid
66838494Sobrienrem_que(qelem *elem)
66938494Sobrien{
67038494Sobrien  qelem *p, *p2;
67138494Sobrien
67238494Sobrien  p = elem->q_forw;
67338494Sobrien  p2 = elem->q_back;
67438494Sobrien
67538494Sobrien  p2->q_forw = p;
67638494Sobrien  p->q_back = p2;
67738494Sobrien}
678