fsi_util.c revision 131702
139092Srnordier/*
239092Srnordier * Copyright (c) 1997-2004 Erez Zadok
339092Srnordier * Copyright (c) 1989 Jan-Simon Pendry
439092Srnordier * Copyright (c) 1989 Imperial College of Science, Technology & Medicine
539092Srnordier * Copyright (c) 1989 The Regents of the University of California.
639092Srnordier * All rights reserved.
739092Srnordier *
839092Srnordier * Redistribution and use in source and binary forms, with or without
939092Srnordier * modification, are permitted provided that the following conditions
1039092Srnordier * are met:
1139092Srnordier * 1. Redistributions of source code must retain the above copyright
1239092Srnordier *    notice, this list of conditions and the following disclaimer.
1339092Srnordier * 2. Redistributions in binary form must reproduce the above copyright
1439092Srnordier *    notice, this list of conditions and the following disclaimer in the
1539092Srnordier *    documentation and/or other materials provided with the distribution.
1639092Srnordier * 3. All advertising materials mentioning features or use of this software
1739092Srnordier *    must display the following acknowledgment:
1839092Srnordier *      This product includes software developed by the University of
1939092Srnordier *      California, Berkeley and its contributors.
2039092Srnordier * 4. Neither the name of the University nor the names of its contributors
2139092Srnordier *    may be used to endorse or promote products derived from this software
2239092Srnordier *    without specific prior written permission.
2339092Srnordier *
2439092Srnordier * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2539092Srnordier * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2639092Srnordier * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2739092Srnordier * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2839092Srnordier * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2950479Speter * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3039092Srnordier * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3139092Srnordier * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32103917Smike * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33130927Sobrien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3439092Srnordier * SUCH DAMAGE.
3539092Srnordier *
3639092Srnordier *      %W% (Berkeley) %G%
37142108Sru *
38142108Sru * $Id: fsi_util.c,v 1.3.2.6 2004/01/06 03:15:23 ezk Exp $
39142108Sru *
40142108Sru */
41142108Sru
42154711Sdelphij#ifdef HAVE_CONFIG_H
43154711Sdelphij# include <config.h>
44130927Sobrien#endif /* HAVE_CONFIG_H */
4539092Srnordier#include <am_defs.h>
4639092Srnordier#include <fsi_data.h>
4739092Srnordier#include <fsinfo.h>
4839092Srnordier
4939092Srnordier/* static variables */
5039092Srnordierstatic int show_range = 10;
5139092Srnordierstatic int col = 0;
5239092Srnordierstatic int total_shown = 0;
5339092Srnordierstatic int total_mmm = 8;
5439092Srnordier
5539092Srnordier
5639092Srnordierstatic int
5739092Srnordiercol_output(int len)
5839092Srnordier{
5939092Srnordier  int wrapped = 0;
6039092Srnordier
6139092Srnordier  col += len;
6239092Srnordier  if (col > 77) {
6339092Srnordier    fputc('\n', stdout);
6439092Srnordier    col = len;
6539092Srnordier    wrapped = 1;
6639092Srnordier  }
6739092Srnordier  return wrapped;
6839092Srnordier}
6939092Srnordier
7039092Srnordier
7139092Srnordierstatic void
7239092Srnordiershow_total(void)
7339092Srnordier{
7455416Smarcel  if (total_mmm != -show_range + 1) {
7555416Smarcel    char n[8];
7655416Smarcel    int len;
7755416Smarcel
7855416Smarcel    if (total_mmm < 0)
7955416Smarcel      fputc('*', stdout);
8055416Smarcel    sprintf(n, "%d", total_shown);
8155416Smarcel    len = strlen(n);
8239092Srnordier    if (col_output(len))
8339092Srnordier      fputc(' ', stdout);
8439092Srnordier    fputs(n, stdout);
8539092Srnordier    fflush(stdout);
8639092Srnordier    total_mmm = -show_range;
8739092Srnordier  }
8839092Srnordier}
8939092Srnordier
9039092Srnordier
9139092Srnordiervoid
9239092Srnordiercol_cleanup(int eoj)
9339092Srnordier{
9439092Srnordier  if (verbose < 0)
9539092Srnordier    return;
9639092Srnordier  if (eoj) {
9739092Srnordier    show_total();
9839092Srnordier    fputs(")]", stdout);
9939092Srnordier  }
10039092Srnordier  if (col) {
10139092Srnordier    fputc('\n', stdout);
10239092Srnordier    col = 0;
10339092Srnordier  }
10455416Smarcel}
10539092Srnordier
10639092Srnordier
10739092Srnordier/*
10839092Srnordier * Lots of ways of reporting errors...
10939125Srnordier */
11039125Srnordiervoid
11139092Srnordiererror(char *fmt, ...)
11239092Srnordier{
11339092Srnordier  va_list ap;
11439092Srnordier
11539092Srnordier  va_start(ap, fmt);
11639092Srnordier  col_cleanup(0);
11739092Srnordier  fprintf(stderr, "%s: Error, ", progname);
11839092Srnordier  vfprintf(stderr, fmt, ap);
11939092Srnordier  fputc('\n', stderr);
12039092Srnordier  errors++;
12139092Srnordier  va_end(ap);
12239092Srnordier}
12339092Srnordier
12439092Srnordier
12539092Srnordiervoid
12655416Smarcellerror(ioloc *l, char *fmt, ...)
12739092Srnordier{
12839092Srnordier  va_list ap;
12939092Srnordier
13039092Srnordier  va_start(ap, fmt);
13139092Srnordier  col_cleanup(0);
13239092Srnordier  fprintf(stderr, "%s:%d: ", l->i_file, l->i_line);
13339092Srnordier  vfprintf(stderr, fmt, ap);
13439092Srnordier  fputc('\n', stderr);
13539092Srnordier  errors++;
13639092Srnordier  va_end(ap);
13739092Srnordier}
13839092Srnordier
13939092Srnordier
14039092Srnordiervoid
14139092Srnordierlwarning(ioloc *l, char *fmt, ...)
14239092Srnordier{
14339092Srnordier  va_list ap;
14439092Srnordier
14539092Srnordier  va_start(ap, fmt);
14639092Srnordier  col_cleanup(0);
14739092Srnordier  fprintf(stderr, "%s:%d: ", l->i_file, l->i_line);
14839092Srnordier  vfprintf(stderr, fmt, ap);
14939092Srnordier  fputc('\n', stderr);
15039092Srnordier  va_end(ap);
15139092Srnordier}
15239092Srnordier
15339125Srnordier
15439092Srnordiervoid
15539092Srnordierfatal(char *fmt, ...)
15639092Srnordier{
15739092Srnordier  va_list ap;
15839092Srnordier
15939092Srnordier  va_start(ap, fmt);
16039092Srnordier  col_cleanup(1);
16139092Srnordier  fprintf(stderr, "%s: Fatal, ", progname);
16239092Srnordier  vfprintf(stderr, fmt, ap);
16339092Srnordier  fputc('\n', stderr);
16439092Srnordier  va_end(ap);
16539092Srnordier  exit(1);
16639092Srnordier}
16739092Srnordier
16839092Srnordier
16939092Srnordier/*
17039092Srnordier * Debug log
17139092Srnordier */
17239092Srnordiervoid
17339092Srnordierfsi_log(char *fmt, ...)
17439092Srnordier{
17539092Srnordier  va_list ap;
17639092Srnordier
17739092Srnordier  if (verbose > 0) {
17839092Srnordier    va_start(ap, fmt);
17939092Srnordier    fputc('#', stdout);
18039092Srnordier    fprintf(stdout, "%s: ", progname);
18139092Srnordier    vfprintf(stdout, fmt, ap);
18239092Srnordier    putc('\n', stdout);
18339092Srnordier    va_end(ap);
18439092Srnordier  }
18539092Srnordier}
18639092Srnordier
18739092Srnordier
18839092Srnordiervoid
18939092Srnordierinfo_hdr(FILE *ef, char *info)
19039092Srnordier{
19139092Srnordier  fprintf(ef, "# *** NOTE: This file contains %s info\n", info);
19239092Srnordier}
19339092Srnordier
19439092Srnordier
19539092Srnordiervoid
19639092Srnordiergen_hdr(FILE *ef, char *hn)
19739092Srnordier{
19839092Srnordier  fprintf(ef, "# *** NOTE: Only for use on %s\n", hn);
19939092Srnordier}
20039092Srnordier
20139092Srnordier
202112092Srustatic void
20339092Srnordiermake_banner(FILE *fp)
20455416Smarcel{
20539092Srnordier  time_t t = time((time_t *) 0);
20639092Srnordier  char *cp = ctime(&t);
20755416Smarcel
20855416Smarcel  fprintf(fp,
20939092Srnordier	  "\
21039092Srnordier# *** This file was automatically generated -- DO NOT EDIT HERE ***\n\
21139092Srnordier# \"%s\" run by %s@%s on %s\
21239092Srnordier#\n\
21339092Srnordier",
21439092Srnordier	  progname, username, hostname, cp);
21539092Srnordier}
21639092Srnordier
21739092Srnordier
21839092Srnordiervoid
21939092Srnordiershow_new(char *msg)
22039092Srnordier{
22139092Srnordier  if (verbose < 0)
22239092Srnordier    return;
22339092Srnordier
22439092Srnordier  total_shown++;
22539092Srnordier  if (total_mmm > show_range) {
22639092Srnordier    show_total();
22739092Srnordier  } else if (total_mmm == 0) {
22839092Srnordier    fputc('*', stdout);
22939092Srnordier    fflush(stdout);
23039092Srnordier    col += 1;
23139092Srnordier  }
23239092Srnordier  total_mmm++;
23339092Srnordier}
23439092Srnordier
23539092Srnordier
23639092Srnordiervoid
23739092Srnordiershow_area_being_processed(char *area, int n)
23839092Srnordier{
23955416Smarcel  static char *last_area = 0;
24039092Srnordier
24139092Srnordier  if (verbose < 0)
24239092Srnordier    return;
24339092Srnordier  if (last_area) {
24439092Srnordier    if (total_shown)
24539092Srnordier      show_total();
24639092Srnordier    fputs(")", stdout);
24755416Smarcel    col += 1;
24839092Srnordier  }
24939092Srnordier
25039092Srnordier  if (!last_area || !STREQ(area, last_area)) {
25139092Srnordier    if (last_area) {
25239092Srnordier      col_cleanup(0);
25339092Srnordier      total_shown = 0;
25439125Srnordier      total_mmm = show_range + 1;
255154711Sdelphij    }
25639092Srnordier    (void) col_output(strlen(area) + 2);
25739092Srnordier    fprintf(stdout, "[%s", area);
25839092Srnordier    last_area = area;
25939092Srnordier  }
26039092Srnordier
26139092Srnordier  fputs(" (", stdout);
26239092Srnordier  col += 2;
26339092Srnordier  show_range = n;
26439092Srnordier  total_mmm = n + 1;
26539092Srnordier
26639092Srnordier  fflush(stdout);
26739092Srnordier}
26839092Srnordier
26939092Srnordier
270112092Sru/*
271130927Sobrien * Open a file with the given prefix and name
272130927Sobrien */
273130927SobrienFILE *
274112092Srupref_open(char *pref, char *hn, void (*hdr) (FILE *, char *), char *arg)
27539092Srnordier{
27639092Srnordier  char p[MAXPATHLEN];
27739092Srnordier  FILE *ef;
27839092Srnordier
27939092Srnordier  sprintf(p, "%s%s", pref, hn);
28039092Srnordier  fsi_log("Writing %s info for %s to %s", pref, hn, p);
28139092Srnordier  ef = fopen(p, "w");
28239092Srnordier  if (ef) {
28339092Srnordier    (*hdr) (ef, arg);
28439092Srnordier    make_banner(ef);
28539092Srnordier  } else {
28639092Srnordier    error("can't open %s for writing", p);
28739092Srnordier  }
28839092Srnordier
28939092Srnordier  return ef;
29039092Srnordier}
29139092Srnordier
29239092Srnordier
29339092Srnordierint
29439092Srnordierpref_close(FILE *fp)
29539092Srnordier{
29639092Srnordier  return fclose(fp) == 0;
29739092Srnordier}
29839092Srnordier
29939092Srnordier
30039092Srnordier/*
30139092Srnordier * Determine where Amd would automount the host/volname pair
30239092Srnordier */
30339092Srnordiervoid
30439092Srnordiercompute_automount_point(char *buf, host *hp, char *vn)
30539092Srnordier{
30639092Srnordier  sprintf(buf, "%s/%s%s", autodir, hp->h_lochost, vn);
30739092Srnordier}
30839092Srnordier
30939092Srnordier
31039092Srnordierchar *
31139092Srnordierxcalloc(int i, int s)
31239092Srnordier{
31339092Srnordier  char *p = (char *) calloc(i, (unsigned) s);
31439092Srnordier
315130927Sobrien  if (!p)
316130927Sobrien    fatal("Out of memory");
317130927Sobrien  return p;
31839092Srnordier}
31939092Srnordier
32039092Srnordier
32139092Srnordier/*
32239092Srnordier * Data constructors..
32339092Srnordier */
32439092Srnordierautomount *
32539092Srnordiernew_automount(char *name)
32639092Srnordier{
327130927Sobrien  automount *ap = CALLOC(struct automount);
32839092Srnordier
32939092Srnordier  ap->a_ioloc = current_location();
33039092Srnordier  ap->a_name = name;
33155416Smarcel  ap->a_volname = 0;
33239092Srnordier  ap->a_mount = 0;
33339092Srnordier  ap->a_opts = 0;
33439092Srnordier  show_new("automount");
33539092Srnordier  return ap;
33639092Srnordier}
33739092Srnordier
33839092Srnordier
339177933Sdfrauto_tree *
340177933Sdfrnew_auto_tree(char *def, qelem *ap)
34139092Srnordier{
34239092Srnordier  auto_tree *tp = CALLOC(struct auto_tree);
34339092Srnordier
34439092Srnordier  tp->t_ioloc = current_location();
34539092Srnordier  tp->t_defaults = def;
34639092Srnordier  tp->t_mount = ap;
34739092Srnordier  show_new("auto_tree");
348130927Sobrien  return tp;
34939092Srnordier}
350130927Sobrien
35139092Srnordier
35239092Srnordierhost *
35339092Srnordiernew_host(void)
35439092Srnordier{
35539092Srnordier  host *hp = CALLOC(struct host);
35639092Srnordier
357130927Sobrien  hp->h_ioloc = current_location();
358130927Sobrien  hp->h_mask = 0;
359130927Sobrien  show_new("host");
360130927Sobrien  return hp;
361130927Sobrien}
36239092Srnordier
36339092Srnordier
36439092Srnordiervoid
36539092Srnordierset_host(host *hp, int k, char *v)
36639092Srnordier{
36739092Srnordier  int m = 1 << k;
36839092Srnordier
369130927Sobrien  if (hp->h_mask & m) {
370130927Sobrien    yyerror("host field \"%s\" already set", host_strings[k]);
371130927Sobrien    return;
372130927Sobrien  }
37339092Srnordier  hp->h_mask |= m;
37439092Srnordier
375130927Sobrien  switch (k) {
376130927Sobrien
377130927Sobrien  case HF_HOST:{
37839092Srnordier      char *p = strdup(v);
37939092Srnordier      dict_ent *de = dict_locate(dict_of_hosts, v);
38039092Srnordier
381130927Sobrien      if (de)
382130927Sobrien	yyerror("duplicate host %s!", v);
383130927Sobrien      else
38439092Srnordier	dict_add(dict_of_hosts, v, (char *) hp);
38539092Srnordier      hp->h_hostname = v;
38639092Srnordier      domain_strip(p, hostname);
38739092Srnordier      if (strchr(p, '.') != 0)
38839092Srnordier	XFREE(p);
38939092Srnordier      else
39039092Srnordier	hp->h_lochost = p;
391130927Sobrien    }
39239092Srnordier    break;
39339092Srnordier
39439092Srnordier  case HF_CONFIG:{
39539092Srnordier      qelem *q;
39639092Srnordier      qelem *vq = (qelem *) v;
39739092Srnordier
39839092Srnordier      hp->h_mask &= ~m;
39939092Srnordier      if (hp->h_config)
40039092Srnordier	q = hp->h_config;
40139092Srnordier      else
40239092Srnordier	q = hp->h_config = new_que();
40339092Srnordier      ins_que(vq, q->q_back);
404130927Sobrien    }
40539092Srnordier    break;
40639092Srnordier
40739092Srnordier  case HF_ETHER:{
40839092Srnordier      qelem *q;
40939092Srnordier      qelem *vq = (qelem *) v;
410197051Simp
411130927Sobrien      hp->h_mask &= ~m;
412130927Sobrien      if (hp->h_ether)
413130927Sobrien	q = hp->h_ether;
414130927Sobrien      else
415130927Sobrien	q = hp->h_ether = new_que();
41639092Srnordier      ins_que(vq, q->q_back);
417130927Sobrien    }
41839092Srnordier    break;
41939092Srnordier
42039092Srnordier  case HF_ARCH:
42139092Srnordier    hp->h_arch = v;
422130927Sobrien    break;
423130927Sobrien
424130927Sobrien  case HF_OS:
425130927Sobrien    hp->h_os = v;
426130927Sobrien    break;
427112092Sru
428130927Sobrien  case HF_CLUSTER:
429263836Sbrueffer    hp->h_cluster = v;
430130927Sobrien    break;
43139092Srnordier
43239092Srnordier  default:
43339092Srnordier    abort();
43439092Srnordier    break;
43539092Srnordier  }
43639092Srnordier}
43739092Srnordier
43839092Srnordier
43939092Srnordierether_if *
44039092Srnordiernew_ether_if(void)
44139092Srnordier{
44239092Srnordier  ether_if *ep = CALLOC(struct ether_if);
44339092Srnordier
44439092Srnordier  ep->e_mask = 0;
44539092Srnordier  ep->e_ioloc = current_location();
44639092Srnordier  show_new("ether_if");
44739092Srnordier  return ep;
44839092Srnordier}
44939092Srnordier
45039092Srnordier
45139092Srnordiervoid
45239092Srnordierset_ether_if(ether_if *ep, int k, char *v)
45339092Srnordier{
45439092Srnordier  int m = 1 << k;
45539092Srnordier
45639092Srnordier  if (ep->e_mask & m) {
45739092Srnordier    yyerror("netif field \"%s\" already set", ether_if_strings[k]);
45839092Srnordier    return;
45939092Srnordier  }
46039092Srnordier  ep->e_mask |= m;
46139092Srnordier
46239092Srnordier  switch (k) {
46339092Srnordier
46439092Srnordier  case EF_INADDR:{
46539092Srnordier      ep->e_inaddr.s_addr = inet_addr(v);
46639092Srnordier      if (ep->e_inaddr.s_addr == (u_long) - 1)
46739092Srnordier	yyerror("malformed IP dotted quad: %s", v);
46839092Srnordier      XFREE(v);
46939092Srnordier    }
47039092Srnordier    break;
47139092Srnordier
47239092Srnordier  case EF_NETMASK:{
47339092Srnordier      u_long nm = 0;
47439092Srnordier
47539092Srnordier      if ((sscanf(v, "0x%lx", &nm) == 1 || sscanf(v, "%lx", &nm) == 1) && nm != 0)
47639092Srnordier	ep->e_netmask = htonl(nm);
47739092Srnordier      else
47839092Srnordier	yyerror("malformed netmask: %s", v);
47939092Srnordier      XFREE(v);
48039092Srnordier    }
48139092Srnordier    break;
48239092Srnordier
48339092Srnordier  case EF_HWADDR:
48439092Srnordier    ep->e_hwaddr = v;
48539092Srnordier    break;
48639092Srnordier
487154711Sdelphij  default:
48839092Srnordier    abort();
48939092Srnordier    break;
49039092Srnordier  }
49139092Srnordier}
49239092Srnordier
49339092Srnordier
49439092Srnordiervoid
49539092Srnordierset_disk_fs(disk_fs *dp, int k, char *v)
49639092Srnordier{
49739092Srnordier  int m = 1 << k;
49839092Srnordier
49939092Srnordier  if (dp->d_mask & m) {
50039092Srnordier    yyerror("fs field \"%s\" already set", disk_fs_strings[k]);
50139092Srnordier    return;
50239092Srnordier  }
50339092Srnordier  dp->d_mask |= m;
50455416Smarcel
50539092Srnordier  switch (k) {
50639092Srnordier
50755416Smarcel  case DF_FSTYPE:
50839092Srnordier    dp->d_fstype = v;
50939092Srnordier    break;
51039092Srnordier
51139092Srnordier  case DF_OPTS:
51239092Srnordier    dp->d_opts = v;
51339092Srnordier    break;
51439092Srnordier
51539092Srnordier  case DF_DUMPSET:
51639092Srnordier    dp->d_dumpset = v;
51739092Srnordier    break;
51839092Srnordier
51939092Srnordier  case DF_LOG:
52039092Srnordier    dp->d_log = v;
52139092Srnordier    break;
52239092Srnordier
52339092Srnordier  case DF_PASSNO:
52439092Srnordier    dp->d_passno = atoi(v);
52539092Srnordier    XFREE(v);
52639092Srnordier    break;
52739092Srnordier
52839092Srnordier  case DF_FREQ:
52939092Srnordier    dp->d_freq = atoi(v);
53039092Srnordier    XFREE(v);
53139092Srnordier    break;
53239092Srnordier
53339092Srnordier  case DF_MOUNT:
53439092Srnordier    dp->d_mount = &((fsi_mount *) v)->m_q;
53539092Srnordier    break;
53639092Srnordier
53739092Srnordier  default:
53839092Srnordier    abort();
53939092Srnordier    break;
54039092Srnordier  }
54139092Srnordier}
54239092Srnordier
54339092Srnordier
54439092Srnordierdisk_fs *
54539092Srnordiernew_disk_fs(void)
54639092Srnordier{
54739092Srnordier  disk_fs *dp = CALLOC(struct disk_fs);
54839092Srnordier
54939092Srnordier  dp->d_ioloc = current_location();
55039092Srnordier  show_new("disk_fs");
55139092Srnordier  return dp;
55239092Srnordier}
55339092Srnordier
55439092Srnordier
55539092Srnordiervoid
55639092Srnordierset_mount(fsi_mount *mp, int k, char *v)
55739092Srnordier{
55839092Srnordier  int m = 1 << k;
55939092Srnordier
56039092Srnordier  if (mp->m_mask & m) {
56139092Srnordier    yyerror("mount tree field \"%s\" already set", mount_strings[k]);
56239092Srnordier    return;
56339092Srnordier  }
56439092Srnordier  mp->m_mask |= m;
56539092Srnordier
56639092Srnordier  switch (k) {
56739092Srnordier
56839092Srnordier  case DM_VOLNAME:
56939092Srnordier    dict_add(dict_of_volnames, v, (char *) mp);
57039092Srnordier    mp->m_volname = v;
57139092Srnordier    break;
57239092Srnordier
57339092Srnordier  case DM_EXPORTFS:
57439092Srnordier    mp->m_exportfs = v;
57539092Srnordier    break;
576
577  case DM_SEL:
578    mp->m_sel = v;
579    break;
580
581  default:
582    abort();
583    break;
584  }
585}
586
587
588fsi_mount *
589new_mount(void)
590{
591  fsi_mount *fp = CALLOC(struct fsi_mount);
592
593  fp->m_ioloc = current_location();
594  show_new("mount");
595  return fp;
596}
597
598
599void
600set_fsmount(fsmount *fp, int k, char *v)
601{
602  int m = 1 << k;
603
604  if (fp->f_mask & m) {
605    yyerror("mount field \"%s\" already set", fsmount_strings[k]);
606    return;
607  }
608  fp->f_mask |= m;
609
610  switch (k) {
611
612  case FM_LOCALNAME:
613    fp->f_localname = v;
614    break;
615
616  case FM_VOLNAME:
617    fp->f_volname = v;
618    break;
619
620  case FM_FSTYPE:
621    fp->f_fstype = v;
622    break;
623
624  case FM_OPTS:
625    fp->f_opts = v;
626    break;
627
628  case FM_FROM:
629    fp->f_from = v;
630    break;
631
632  case FM_DIRECT:
633    break;
634
635  default:
636    abort();
637    break;
638  }
639}
640
641
642fsmount *
643new_fsmount(void)
644{
645  fsmount *fp = CALLOC(struct fsmount);
646
647  fp->f_ioloc = current_location();
648  show_new("fsmount");
649  return fp;
650}
651
652
653void
654init_que(qelem *q)
655{
656  q->q_forw = q->q_back = q;
657}
658
659
660qelem *
661new_que(void)
662{
663  qelem *q = CALLOC(qelem);
664
665  init_que(q);
666  return q;
667}
668
669
670void
671ins_que(qelem *elem, qelem *pred)
672{
673  qelem *p;
674
675  p = pred->q_forw;
676  elem->q_back = pred;
677  elem->q_forw = p;
678  pred->q_forw = elem;
679  p->q_back = elem;
680}
681
682
683void
684rem_que(qelem *elem)
685{
686  qelem *p, *p2;
687
688  p = elem->q_forw;
689  p2 = elem->q_back;
690
691  p2->q_forw = p;
692  p->q_back = p2;
693}
694