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