V10/libc/gen/fstab.c

Compare this file to the similar file:
Show the results in this format:

/*
 * crack /etc/fstab; for mount, fsck, et al
 */

#include <fstab.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>

static	struct	fstab fs;
static	FILE	*fs_file = 0;

static	int
fstabscan(fsp)
register struct	fstab *fsp;
{
	char *args[FSTABNARGS];
	char buf[256];

again:
	if (fgets(buf, sizeof(buf), fs_file) == NULL)
		return(0);
	buf[strlen(buf)-1] = 0;	/* discard \n */
	setfields(":");
	if (getfields(buf, args, FSTABNARGS) != FSTABNARGS)
		goto again;
	strcpy(fsp->fs_spec, args[0]);
	strcpy(fsp->fs_file, args[1]);
	if (isdigit(args[2][0]) || args[2][0] == '-') {
		fsp->fs_ftype = atoi(args[2]);
		fsp->fs_flags = atoi(args[3]);
	} else if (strcmp(args[2], "rw") == 0) {
		fsp->fs_ftype = 0;
		fsp->fs_flags = 0;
	} else if (strcmp(args[2], "ro") == 0) {
		fsp->fs_ftype = 0;
		fsp->fs_flags = 1;
	} else if (strcmp(args[2], "sw") == 0) {
		fsp->fs_ftype = FSSWAP;
		fsp->fs_flags = 0;
	} else {
		fsp->fs_ftype = FSNONE;
		fsp->fs_flags = 0;
	}
	fsp->fs_passno = atoi(args[4]);
	return (1);
}
	
int
setfsent()
{
	if (fs_file)
		endfsent();
	if ((fs_file = fopen(FSTAB, "r")) == NULL)
		return(0);
	return(1);
}

int endfsent()
{
	if (fs_file)
		fclose(fs_file);
	return(1);
}

struct fstab *
getfsent()
{

	if ((fs_file == 0) && (setfsent() == 0))
		return(0);
	if (fstabscan(&fs) == 0)
		return (0);
	return (&fs);
}

struct fstab *
getfsspec(name)
char	*name;
{
	register struct fstab *fsp;

	if (setfsent() == 0)	/* start from the beginning */
		return(0);
	while((fsp = getfsent()) != 0){
		if (strcmp(fsp->fs_spec, name) == 0)
			return(fsp);
	}
	return(0);
}

struct fstab *
getfsfile(name)
	char	*name;
{
	register struct fstab *fsp;

	if (setfsent() == 0)	/* start from the beginning */
		return(0);
	while ((fsp = getfsent()) != 0){
		if (strcmp(fsp->fs_file, name) == 0)
			return(fsp);
	}
	return(0);
}