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);
}
|