File: file.c

package info (click to toggle)
resmgr 1.0-2sarge2
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 308 kB
  • ctags: 313
  • sloc: ansic: 3,165; sh: 556; makefile: 109
file content (76 lines) | stat: -rw-r--r-- 1,572 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
 * Device file resource family
 *
 * Copyright (C) 2002, Olaf Kirch <okir@lst.de>
 */

#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include "resmgrd.h"

typedef struct res_file_name res_file_name_t;
struct res_file_name {
	res_name_t	base;
	char *		filename;
};

static res_name_t *	res_file_name_parse(const char *);
static const char *	res_file_name_print(res_name_t *);
static void		res_file_name_free(res_name_t *);
static int		res_file_match(res_name_t *, res_device_t *);
static int		res_file_open(res_name_t *, int);

res_family_t	res_family_file = {
	"file",
	0,			/* no special export flags required */
	res_file_name_parse,
	res_file_name_print,
	res_file_name_free,
	res_file_match,
	res_file_open,
};

res_name_t *
res_file_name_parse(const char *name)
{
	res_file_name_t	*fp;

	fp = (res_file_name_t *) calloc(1, sizeof(*fp) + strlen(name) + 1);
	fp->base.ops = &res_family_file;
	fp->filename = (char *) (fp + 1);
	strcpy(fp->filename, name);
	return (res_name_t *) fp;
}

const char *
res_file_name_print(res_name_t *np)
{
	res_file_name_t	*fp = (res_file_name_t *) np;

	return fp->filename;
}

void
res_file_name_free(res_name_t *np)
{
	memset(np, 0, sizeof(res_file_name_t));
	free(np);
}

int
res_file_match(res_name_t *np, res_device_t *dev)
{
	res_file_name_t	*fp = (res_file_name_t *) np;

	return !strcmp(fp->filename, dev->name);
}

int
res_file_open(res_name_t *np, int flags)
{
	res_file_name_t	*fp = (res_file_name_t *) np;

	flags = (flags & DEV_FLAGS_RO)? O_RDONLY : O_RDWR;
	return open(fp->filename, flags | O_NONBLOCK);
}