typedef struct Rule Rule;
#pragma incomplete Rule /* See 9fans "new compiler" 2005-01-07 */
typedef struct RuleOperations
{
void (*free)(Rule *rule);
bool (*issatisfy)(Rule *rule, char *path, Dir *d);
bool (*contains)(Rule *rule, char *path, int omode, ulong perm);
} RuleOperations;
struct Rule
{
RuleOperations *ops;
char *root;
char *name;
};
enum { RULE_MAXNAMELEN = 4096 };
/** destructor */
void rule_free(Rule *self);
/** @return the name that the rule represents for debugging purpose */
char *rule_name(Rule *self);
/**
* return dir struct representing the path if path points to an existing dir
* or file that satisfies this rule.
*/
Dir *rule_find(Rule *self, char *path);
/**
* same as rule_open_file except caller gets the corresponding Dir* which the
* caller is responsible to free.
*/
int rule_satisfied_open_file(Rule *self,
char *path, int omode, Dir **satisfies);
/**
* same as rule_open_dir except caller gets the corresponding Dir* which the
* caller is responsible to free.
*/
int rule_satisfied_open_dir(Rule *self, char *path, int omode, Dir **satisfies);
/**
* attempts to open path as file if it exists and satisfies
* @return file descriptor that was opened.
*/
int rule_open_file(Rule *self, char *path, int omode);
/**
* attempts to open path as directory if it exists and satisfies
* @return file descriptor that was opened.
*/
int rule_open_dir(Rule *self, char *path, int omode);
/**
* returns true if the path exists and is contained inside this rule, false
* otherwise.
*/
bool rule_exists(Rule *self, char *path);
/** returns true if the path satisfies this rule and false otherwise */
bool rule_contains(Rule *self, char *path, int omode, ulong perm);
/** attempts to create the file pointed to by path */
int rule_create(Rule *self, char *path, int omode, ulong perm);
/**
* attemps to remove path and returns true if remove was successful or if the
* path is single file or empty dir.
*/
bool rule_remove(Rule *self, char *path);
/** sets the stat specified by d */
bool rule_set_stat(Rule *self, char *path, Dir *d);
/** @return true if self and rule has the same root path */
bool rule_same_path(Rule *self, Rule *other);
/** @return true if fullpath of this rule and target rule indicates same file */
bool rule_same_file(Rule *self, char *path, Rule *other, char *otherpath);
/** copies file from this rule to another rule with the new path */
bool rule_copy_file(Rule *self, char *path,
Rule *target, char *newpath, Dir *d);
/**
* private function that user should not use.
* this function is not designed to be used outside of the rule hierarchy.
* andrule and orrule use this.
*/
bool rule_issatisfy(Rule *self, char *path, Dir *d);
String *rule_assemble_path(Rule *self, char *path);
bool rule_contains_true(Rule *, char *, int, ulong);
/** generic issatisfy function that always return true */
bool rule_issatisfy_true(Rule *, char *, Dir *);
/** generic free operation that will just call free on self */
void rule_free_self(Rule *self);
|