17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 57c478bd9Sstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only 67c478bd9Sstevel@tonic-gate * (the "License"). You may not use this file except in compliance 77c478bd9Sstevel@tonic-gate * with the License. 87c478bd9Sstevel@tonic-gate * 97c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 107c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 117c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 127c478bd9Sstevel@tonic-gate * and limitations under the License. 137c478bd9Sstevel@tonic-gate * 147c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 157c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 167c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 177c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 187c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 197c478bd9Sstevel@tonic-gate * 207c478bd9Sstevel@tonic-gate * CDDL HEADER END 217c478bd9Sstevel@tonic-gate */ 227c478bd9Sstevel@tonic-gate /* 237c478bd9Sstevel@tonic-gate * Copyright 1990 Sun Microsystems, Inc. All rights reserved. 247c478bd9Sstevel@tonic-gate * Use is subject to license terms. 257c478bd9Sstevel@tonic-gate */ 267c478bd9Sstevel@tonic-gate 277c478bd9Sstevel@tonic-gate #pragma ident "%Z%%M% %I% %E% SMI" 287c478bd9Sstevel@tonic-gate 297c478bd9Sstevel@tonic-gate #include <stdio.h> 307c478bd9Sstevel@tonic-gate #include <ctype.h> 317c478bd9Sstevel@tonic-gate #include <mntent.h> 327c478bd9Sstevel@tonic-gate #include <sys/file.h> 33*5d54f3d8Smuffin #include <malloc.h> 34*5d54f3d8Smuffin 35*5d54f3d8Smuffin static int mntprtent(FILE *, struct mntent *); 367c478bd9Sstevel@tonic-gate 377c478bd9Sstevel@tonic-gate static struct mntent *mntp; 387c478bd9Sstevel@tonic-gate 397c478bd9Sstevel@tonic-gate struct mntent * 40*5d54f3d8Smuffin _mnt(void) 417c478bd9Sstevel@tonic-gate { 427c478bd9Sstevel@tonic-gate 437c478bd9Sstevel@tonic-gate if (mntp == 0) 447c478bd9Sstevel@tonic-gate mntp = (struct mntent *)calloc(1, sizeof (struct mntent)); 457c478bd9Sstevel@tonic-gate return (mntp); 467c478bd9Sstevel@tonic-gate } 477c478bd9Sstevel@tonic-gate 487c478bd9Sstevel@tonic-gate static char * 49*5d54f3d8Smuffin mntstr(char **p) 507c478bd9Sstevel@tonic-gate { 517c478bd9Sstevel@tonic-gate unsigned char *cp = (unsigned char *) *p; 527c478bd9Sstevel@tonic-gate unsigned char *retstr; 537c478bd9Sstevel@tonic-gate 547c478bd9Sstevel@tonic-gate while (*cp && isspace(*cp)) 557c478bd9Sstevel@tonic-gate cp++; 567c478bd9Sstevel@tonic-gate retstr = cp; 577c478bd9Sstevel@tonic-gate while (*cp && !isspace(*cp)) 587c478bd9Sstevel@tonic-gate cp++; 597c478bd9Sstevel@tonic-gate if (*cp) { 607c478bd9Sstevel@tonic-gate *cp = '\0'; 617c478bd9Sstevel@tonic-gate cp++; 627c478bd9Sstevel@tonic-gate } 637c478bd9Sstevel@tonic-gate *p = (char *) cp; 647c478bd9Sstevel@tonic-gate return ((char *)retstr); 657c478bd9Sstevel@tonic-gate } 667c478bd9Sstevel@tonic-gate 677c478bd9Sstevel@tonic-gate static int 68*5d54f3d8Smuffin mntdigit(char **p) 697c478bd9Sstevel@tonic-gate { 70*5d54f3d8Smuffin int value = 0; 717c478bd9Sstevel@tonic-gate unsigned char *cp = (unsigned char *) *p; 727c478bd9Sstevel@tonic-gate 737c478bd9Sstevel@tonic-gate while (*cp && isspace(*cp)) 747c478bd9Sstevel@tonic-gate cp++; 757c478bd9Sstevel@tonic-gate for (; *cp && isdigit(*cp); cp++) { 767c478bd9Sstevel@tonic-gate value *= 10; 777c478bd9Sstevel@tonic-gate value += *cp - '0'; 787c478bd9Sstevel@tonic-gate } 797c478bd9Sstevel@tonic-gate while (*cp && !isspace(*cp)) 807c478bd9Sstevel@tonic-gate cp++; 817c478bd9Sstevel@tonic-gate if (*cp) { 827c478bd9Sstevel@tonic-gate *cp = '\0'; 837c478bd9Sstevel@tonic-gate cp++; 847c478bd9Sstevel@tonic-gate } 857c478bd9Sstevel@tonic-gate *p = (char *) cp; 867c478bd9Sstevel@tonic-gate return (value); 877c478bd9Sstevel@tonic-gate } 887c478bd9Sstevel@tonic-gate 89*5d54f3d8Smuffin static int 90*5d54f3d8Smuffin mnttabscan(FILE *mnttabp, struct mntent *mnt) 917c478bd9Sstevel@tonic-gate { 927c478bd9Sstevel@tonic-gate static char *line = NULL; 937c478bd9Sstevel@tonic-gate char *cp; 947c478bd9Sstevel@tonic-gate 957c478bd9Sstevel@tonic-gate if (line == NULL) 967c478bd9Sstevel@tonic-gate line = (char *)malloc(BUFSIZ+1); 977c478bd9Sstevel@tonic-gate do { 987c478bd9Sstevel@tonic-gate cp = fgets(line, BUFSIZ, mnttabp); 997c478bd9Sstevel@tonic-gate if (cp == NULL) { 1007c478bd9Sstevel@tonic-gate return (EOF); 1017c478bd9Sstevel@tonic-gate } 1027c478bd9Sstevel@tonic-gate } while (*cp == '#'); 1037c478bd9Sstevel@tonic-gate mnt->mnt_fsname = mntstr(&cp); 1047c478bd9Sstevel@tonic-gate if (*cp == '\0') 1057c478bd9Sstevel@tonic-gate return (1); 1067c478bd9Sstevel@tonic-gate mnt->mnt_dir = mntstr(&cp); 1077c478bd9Sstevel@tonic-gate if (*cp == '\0') 1087c478bd9Sstevel@tonic-gate return (2); 1097c478bd9Sstevel@tonic-gate mnt->mnt_type = mntstr(&cp); 1107c478bd9Sstevel@tonic-gate if (*cp == '\0') 1117c478bd9Sstevel@tonic-gate return (3); 1127c478bd9Sstevel@tonic-gate mnt->mnt_opts = mntstr(&cp); 1137c478bd9Sstevel@tonic-gate if (*cp == '\0') 1147c478bd9Sstevel@tonic-gate return (4); 1157c478bd9Sstevel@tonic-gate mnt->mnt_freq = mntdigit(&cp); 1167c478bd9Sstevel@tonic-gate if (*cp == '\0') 1177c478bd9Sstevel@tonic-gate return (5); 1187c478bd9Sstevel@tonic-gate mnt->mnt_passno = mntdigit(&cp); 1197c478bd9Sstevel@tonic-gate return (6); 1207c478bd9Sstevel@tonic-gate } 1217c478bd9Sstevel@tonic-gate 1227c478bd9Sstevel@tonic-gate FILE * 123*5d54f3d8Smuffin setmntent(char *fname, char *flag) 1247c478bd9Sstevel@tonic-gate { 1257c478bd9Sstevel@tonic-gate FILE *mnttabp; 1267c478bd9Sstevel@tonic-gate 1277c478bd9Sstevel@tonic-gate if ((mnttabp = fopen(fname, flag)) == NULL) { 1287c478bd9Sstevel@tonic-gate return (NULL); 1297c478bd9Sstevel@tonic-gate } 1307c478bd9Sstevel@tonic-gate for (; *flag ; flag++) { 1317c478bd9Sstevel@tonic-gate if (*flag == 'w' || *flag == 'a' || *flag == '+') { 1327c478bd9Sstevel@tonic-gate if (flock(fileno(mnttabp), LOCK_EX) < 0) { 1337c478bd9Sstevel@tonic-gate fclose(mnttabp); 1347c478bd9Sstevel@tonic-gate return (NULL); 1357c478bd9Sstevel@tonic-gate } 1367c478bd9Sstevel@tonic-gate break; 1377c478bd9Sstevel@tonic-gate } 1387c478bd9Sstevel@tonic-gate } 1397c478bd9Sstevel@tonic-gate return (mnttabp); 1407c478bd9Sstevel@tonic-gate } 1417c478bd9Sstevel@tonic-gate 1427c478bd9Sstevel@tonic-gate int 143*5d54f3d8Smuffin endmntent(FILE *mnttabp) 1447c478bd9Sstevel@tonic-gate { 1457c478bd9Sstevel@tonic-gate 1467c478bd9Sstevel@tonic-gate if (mnttabp) { 1477c478bd9Sstevel@tonic-gate fclose(mnttabp); 1487c478bd9Sstevel@tonic-gate } 1497c478bd9Sstevel@tonic-gate return (1); 1507c478bd9Sstevel@tonic-gate } 1517c478bd9Sstevel@tonic-gate 1527c478bd9Sstevel@tonic-gate struct mntent * 153*5d54f3d8Smuffin getmntent(FILE *mnttabp) 1547c478bd9Sstevel@tonic-gate { 1557c478bd9Sstevel@tonic-gate int nfields; 1567c478bd9Sstevel@tonic-gate 1577c478bd9Sstevel@tonic-gate if (mnttabp == 0) 1587c478bd9Sstevel@tonic-gate return ((struct mntent *)0); 1597c478bd9Sstevel@tonic-gate if (_mnt() == 0) 1607c478bd9Sstevel@tonic-gate return ((struct mntent *)0); 1617c478bd9Sstevel@tonic-gate nfields = mnttabscan(mnttabp, mntp); 1627c478bd9Sstevel@tonic-gate if (nfields == EOF || nfields != 6) 1637c478bd9Sstevel@tonic-gate return ((struct mntent *)0); 1647c478bd9Sstevel@tonic-gate return (mntp); 1657c478bd9Sstevel@tonic-gate } 1667c478bd9Sstevel@tonic-gate 167*5d54f3d8Smuffin int 168*5d54f3d8Smuffin addmntent(FILE *mnttabp, struct mntent *mnt) 1697c478bd9Sstevel@tonic-gate { 1707c478bd9Sstevel@tonic-gate if (fseek(mnttabp, 0L, 2) < 0) 1717c478bd9Sstevel@tonic-gate return (1); 1727c478bd9Sstevel@tonic-gate if (mnt == (struct mntent *)0) 1737c478bd9Sstevel@tonic-gate return (1); 1747c478bd9Sstevel@tonic-gate if (mnt->mnt_fsname == NULL || mnt->mnt_dir == NULL || 1757c478bd9Sstevel@tonic-gate mnt->mnt_type == NULL || mnt->mnt_opts == NULL) 1767c478bd9Sstevel@tonic-gate return (1); 1777c478bd9Sstevel@tonic-gate 1787c478bd9Sstevel@tonic-gate mntprtent(mnttabp, mnt); 1797c478bd9Sstevel@tonic-gate return (0); 1807c478bd9Sstevel@tonic-gate } 1817c478bd9Sstevel@tonic-gate 1827c478bd9Sstevel@tonic-gate static char * 183*5d54f3d8Smuffin mntopt(char **p) 1847c478bd9Sstevel@tonic-gate { 1857c478bd9Sstevel@tonic-gate unsigned char *cp = (unsigned char *) *p; 1867c478bd9Sstevel@tonic-gate unsigned char *retstr; 1877c478bd9Sstevel@tonic-gate 1887c478bd9Sstevel@tonic-gate while (*cp && isspace(*cp)) 1897c478bd9Sstevel@tonic-gate cp++; 1907c478bd9Sstevel@tonic-gate retstr = cp; 1917c478bd9Sstevel@tonic-gate while (*cp && *cp != ',') 1927c478bd9Sstevel@tonic-gate cp++; 1937c478bd9Sstevel@tonic-gate if (*cp) { 1947c478bd9Sstevel@tonic-gate *cp = '\0'; 1957c478bd9Sstevel@tonic-gate cp++; 1967c478bd9Sstevel@tonic-gate } 1977c478bd9Sstevel@tonic-gate *p = (char *) cp; 1987c478bd9Sstevel@tonic-gate return ((char *)retstr); 1997c478bd9Sstevel@tonic-gate } 2007c478bd9Sstevel@tonic-gate 2017c478bd9Sstevel@tonic-gate char * 202*5d54f3d8Smuffin hasmntopt(struct mntent *mnt, char *opt) 2037c478bd9Sstevel@tonic-gate { 2047c478bd9Sstevel@tonic-gate char *f, *opts; 2057c478bd9Sstevel@tonic-gate static char *tmpopts; 2067c478bd9Sstevel@tonic-gate 2077c478bd9Sstevel@tonic-gate if (tmpopts == 0) { 2087c478bd9Sstevel@tonic-gate tmpopts = (char *)calloc(256, sizeof (char)); 2097c478bd9Sstevel@tonic-gate if (tmpopts == 0) 2107c478bd9Sstevel@tonic-gate return (0); 2117c478bd9Sstevel@tonic-gate } 2127c478bd9Sstevel@tonic-gate strcpy(tmpopts, mnt->mnt_opts); 2137c478bd9Sstevel@tonic-gate opts = tmpopts; 2147c478bd9Sstevel@tonic-gate f = mntopt(&opts); 2157c478bd9Sstevel@tonic-gate for (; *f; f = mntopt(&opts)) { 2167c478bd9Sstevel@tonic-gate if (strncmp(opt, f, strlen(opt)) == 0) 2177c478bd9Sstevel@tonic-gate return (f - tmpopts + mnt->mnt_opts); 2187c478bd9Sstevel@tonic-gate } 2197c478bd9Sstevel@tonic-gate return (NULL); 2207c478bd9Sstevel@tonic-gate } 2217c478bd9Sstevel@tonic-gate 222*5d54f3d8Smuffin static int 223*5d54f3d8Smuffin mntprtent(FILE *mnttabp, struct mntent *mnt) 2247c478bd9Sstevel@tonic-gate { 2257c478bd9Sstevel@tonic-gate fprintf(mnttabp, "%s %s %s %s %d %d\n", 2267c478bd9Sstevel@tonic-gate mnt->mnt_fsname, 2277c478bd9Sstevel@tonic-gate mnt->mnt_dir, 2287c478bd9Sstevel@tonic-gate mnt->mnt_type, 2297c478bd9Sstevel@tonic-gate mnt->mnt_opts, 2307c478bd9Sstevel@tonic-gate mnt->mnt_freq, 2317c478bd9Sstevel@tonic-gate mnt->mnt_passno); 2327c478bd9Sstevel@tonic-gate return (0); 2337c478bd9Sstevel@tonic-gate } 234