⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 exportent.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#if !defined(lint) && defined(SCCSIDS)static  char sccsid[] = "@(#)exportent.c 1.1 92/07/30 SMI";#endif/* * Exported file system table manager. Reads/writes "/etc/xtab". * Copyright (C) 1986 by Sun Microsystems, Inc. */#include <stdio.h>#include <exportent.h>#include <sys/file.h>#include <ctype.h>extern char *strtok();extern char *strcpy();#define LINESIZE 1024static char *TMPFILE = "/tmp/xtabXXXXXX";static char *skipwhite();static char *skipnonwhite();FILE *setexportent(){	FILE *f;	int fd;	/*	 * Create the tab file if it does not exist already	 */ 	if (access(TABFILE, F_OK) < 0) {		fd = open(TABFILE, O_CREAT, 0644);		close(fd);	}	if (access(TABFILE, W_OK) == 0) {		f = fopen(TABFILE, "r+");	} else {		f = fopen(TABFILE, "r");	}	if (f == NULL) {		   	return (NULL);	}	if (flock(fileno(f), LOCK_EX) < 0) {		(void)fclose(f);		return (NULL);	}	return (f);}voidendexportent(f)	FILE *f;{	(void)fclose(f);}struct exportent *getexportent(f)	FILE *f;{	static char *line = NULL;	static struct exportent xent;	int len;	char *p;	if (line == NULL) {		line = (char *)malloc(LINESIZE + 1);	}	if (fgets(line, LINESIZE, f) == NULL) {		return (NULL);	}	len = strlen(line);	if (line[len-1] == '\n') {		line[len-1] = 0;	}	xent.xent_dirname = line;	xent.xent_options = NULL;	p = skipnonwhite(line);	if (*p == 0) {		return (&xent);	}	*p++ = 0;	p = skipwhite(p);	if (*p == 0) {		return (&xent);	}	if (*p == '-') {		p++;	}	xent.xent_options = p;	return (&xent);}remexportent(f, dirname)	FILE *f;	char *dirname;{	char buf[LINESIZE];	FILE *f2;	int len;	char *fname;	int fd;	long pos;	long rempos;	int remlen;	int res;	fname = (char *) malloc(strlen(TMPFILE) + 1);	pos = ftell(f);	rempos = 0;	remlen = 0;	(void)strcpy(fname, TMPFILE); 	fd = mkstemp(fname);	if (fd < 0) {		return (-1);	}	if (unlink(fname) < 0) {		(void)close(fd);		return (-1);	}	f2 = fdopen(fd, "r+");	if (f2 == NULL) {		(void)close(fd);		return (-1);	}	len = strlen(dirname);	rewind(f);	while (fgets(buf, sizeof(buf), f)) {		if (strncmp(buf, dirname, 		    len) != 0 || ! isspace((unsigned char)buf[len])) {			if (fputs(buf, f2) <= 0) {				(void)fclose(f2);					return (-1);			}		} else {			remlen = strlen(buf);			rempos = ftell(f) - remlen;		}	}	rewind(f);	if (ftruncate(fileno(f), 0L) < 0) {		(void)fclose(f2);			return (-1);	}	rewind(f2);	while (fgets(buf, sizeof(buf), f2)) {		if (fputs(buf, f) <= 0) {			(void)fclose(f2);			return (-1);		}	}	(void)fclose(f2);	if (remlen == 0) {		/* nothing removed */		(void) fseek(f, pos, L_SET);		res = -1;	} else if (pos <= rempos) {		res = fseek(f, pos, L_SET);	} else if (pos > rempos + remlen) {		res = fseek(f, pos - remlen, L_SET);	} else {		res = fseek(f, rempos, L_SET);	}	return (res < 0 ? -1 : 0); }addexportent(f, dirname, options)	FILE *f;	char *dirname;	char *options;{	long pos;		pos = ftell(f);	if (fseek(f, 0L, L_XTND) >= 0 &&	    fprintf(f, "%s", dirname) > 0 &&	    (options == NULL || fprintf(f, " -%s", options) > 0) && 	    fprintf(f, "\n") > 0 &&	    fseek(f, pos, L_SET) >= 0) {		return (0);	}	return (-1);} char *getexportopt(xent, opt)	struct exportent *xent;	char *opt;{	static char *tokenbuf = NULL;	char *lp;	char *tok;	int len;	if (tokenbuf == NULL) {		tokenbuf = (char *)malloc(LINESIZE);	}	if (xent->xent_options == NULL) {		return (NULL);	}	(void)strcpy(tokenbuf, xent->xent_options);	lp = tokenbuf;	len = strlen(opt);	while ((tok = strtok(lp, ",")) != NULL) {		lp = NULL;		if (strncmp(opt, tok, len) == 0) {			if (tok[len] == '=') {				return (&tok[len + 1]);			} else if (tok[len] == 0) {				return ("");			}		}	}	return (NULL);}	 #define iswhite(c) 	((c) == ' ' || c == '\t')static char *skipwhite(str)	char *str;{	while (*str && iswhite(*str)) {		str++;	}	return (str);}static char *skipnonwhite(str)	char *str;{	while (*str && ! iswhite(*str)) {		str++;	}	return (str);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -