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