本文整理汇总了C++中dirlookup函数的典型用法代码示例。如果您正苦于以下问题:C++ dirlookup函数的具体用法?C++ dirlookup怎么用?C++ dirlookup使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dirlookup函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: main
int main(int argc, char **argv)
{
int reti;
uint16_t vid;
struct vol *vol;
struct dir *retdir;
struct path *path;
/* initialize */
printf("Initializing\n============\n");
TEST(setuplog("default:note","/dev/tty"));
TEST( afp_options_parse_cmdline(&obj, 3, &args[0]) );
TEST_int( afp_config_parse(&obj, NULL), 0);
TEST_int( configinit(&obj), 0);
TEST( cnid_init() );
TEST( load_volumes(&obj, NULL) );
TEST_int( dircache_init(8192), 0);
obj.afp_version = 32;
printf("\n");
/* now run tests */
printf("Running tests\n=============\n");
TEST_expr(vid = openvol(&obj, "test"), vid != 0);
TEST_expr(vol = getvolbyvid(vid), vol != NULL);
/* test directory.c stuff */
TEST_expr(retdir = dirlookup(vol, DIRDID_ROOT_PARENT), retdir != NULL);
TEST_expr(retdir = dirlookup(vol, DIRDID_ROOT), retdir != NULL);
TEST_expr(path = cname(vol, retdir, cnamewrap("Network Trash Folder")), path != NULL);
TEST_expr(retdir = dirlookup(vol, DIRDID_ROOT), retdir != NULL);
TEST_int(getfiledirparms(&obj, vid, DIRDID_ROOT_PARENT, "test"), 0);
TEST_int(getfiledirparms(&obj, vid, DIRDID_ROOT, ""), 0);
TEST_expr(reti = createdir(&obj, vid, DIRDID_ROOT, "dir1"),
reti == 0 || reti == AFPERR_EXIST);
TEST_int(getfiledirparms(&obj, vid, DIRDID_ROOT, "dir1"), 0);
/*
FIXME: this doesn't work although it should. "//" get translated to \000 \000 at means ".."
ie this should getfiledirparms for DIRDID_ROOT_PARENT -- at least afair!
TEST_int(getfiledirparms(&configs->obj, vid, DIRDID_ROOT, "//"), 0);
*/
TEST_int(createfile(&obj, vid, DIRDID_ROOT, "dir1/file1"), 0);
TEST_int(delete(&obj, vid, DIRDID_ROOT, "dir1/file1"), 0);
TEST_int(delete(&obj, vid, DIRDID_ROOT, "dir1"), 0);
TEST_int(createfile(&obj, vid, DIRDID_ROOT, "file1"), 0);
TEST_int(getfiledirparms(&obj, vid, DIRDID_ROOT, "file1"), 0);
TEST_int(delete(&obj, vid, DIRDID_ROOT, "file1"), 0);
/* test enumerate.c stuff */
TEST_int(enumerate(&obj, vid, DIRDID_ROOT), 0);
}
示例2: namex
// Look up and return the inode for a path name.
// If parent != 0, return the inode for the parent and copy the final
// path element into name, which must have room for DIRSIZ bytes.
static struct inode*
namex(char *path, int nameiparent, char *name)
{
struct inode *ip, *next;
if(*path == '/')
ip = iget(ROOTDEV, ROOTINO);
else
ip = idup(proc->cwd);
while((path = skipelem(path, name)) != 0){
ilock(ip);
if(ip->type != T_DIR){
iunlockput(ip);
return 0;
}
if(nameiparent && *path == '\0'){
// Stop one level early.
iunlock(ip);
return ip;
}
if((next = dirlookup(ip, name, 0)) == 0){
iunlockput(ip);
return 0;
}
iunlockput(ip);
ip = next;
}
if(nameiparent){
iput(ip);
return 0;
}
return ip;
}
示例3: namedtube
/*
* Return a tube for name segmentname!tubename,
* creating any of them if mkit is true and it is not found.
*/
Tube*
namedtube(char *name, ulong msz, int n, int mkit)
{
char *dir, *tname;
Tdir *tl;
Tube *t;
dumpdir("dir before namedtube");
name = strdup(name);
if(name == nil)
return nil;
tname = utfrune(name, '!');
if(tname == nil){
dir = "tubes";
tname = name;
}else{
dir = name;
*tname++ = 0;
}
t = nil;
tl = dirlookup(dir, mkit);
if(tl != nil)
t = tubelookup(tl, tname, msz, n, mkit);
free(name);
return t;
}
示例4: dirlink
int dirlink(struct inode *dp, char *dirname, uint32_t ino)
{
if(!ISDIR(dp->mode) || ino < 1) {
return -1;
}
if(dirlookup(dp, dirname, 0))
return -1;
struct dirent dir;
int off;
for(off = 0; off < dp->size; off+=sizeof(struct dirent))
{
if(!readi(dp, (char *)&dir, off, sizeof(struct dirent))) {
return -1;
}
// found a new entry
if(!dir.ino)
break;
}
dir.ino = ino;
strcpy(dir.name, dirname);
writei(dp, (char *)&dir, off, sizeof(struct dirent));
return 0;
}
示例5: dirlink
// Write a new directory entry (name, inum) into the directory dp.
int
dirlink(struct inode *dp, char *name, uint inum)
{
int off;
struct dirent de;
struct inode *ip;
// Check that name is not present.
if((ip = dirlookup(dp, name, 0)) != 0){
iput(ip);
return -1;
}
// Look for an empty dirent.
for(off = 0; off < dp->size; off += sizeof(de)){
if(readi(dp, (char*)&de, off, sizeof(de)) != sizeof(de))
panic("dirlink read");
if(de.inum == 0)
break;
}
strncpy(de.name, name, DIRSIZ);
de.inum = inum;
if(writei(dp, (char*)&de, off, sizeof(de)) != sizeof(de))
panic("dirlink");
return 0;
}
示例6: kernel_unlink
int
kernel_unlink(char* path)
{
struct inode *ip, *dp;
struct dirent de;
char name[DIRSIZ];
uint off;
// if(argstr(0, &path) < 0)
// return -1;
if((dp = nameiparent(path, name)) == 0)
return -1;
begin_trans();
ilock(dp);
// Cannot unlink "." or "..".
if(namecmp(name, ".") == 0 || namecmp(name, "..") == 0)
goto bad;
if((ip = dirlookup(dp, name, &off)) == 0)
goto bad;
ilock(ip);
if(ip->nlink < 1)
panic("unlink: nlink < 1");
/*
if(ip->type == T_DIR && !isdirempty(ip)){
iunlockput(ip);
goto bad;
}
*/
memset(&de, 0, sizeof(de));
if(writei(dp, (char*)&de, off, sizeof(de)) != sizeof(de))
panic("unlink: writei");
if(ip->type == T_DIR){
dp->nlink--;
iupdate(dp);
}
iunlockput(dp);
ip->nlink--;
iupdate(ip);
iunlockput(ip);
commit_trans();
return 0;
bad:
iunlockput(dp);
commit_trans();
return -1;
}
示例7: getforkparams
static int getforkparams(struct ofork *ofork, u_int16_t bitmap, char *buf, size_t *buflen)
{
struct path path;
struct stat *st;
struct adouble *adp;
struct dir *dir;
struct vol *vol;
/* can only get the length of the opened fork */
if ( ( (bitmap & ((1<<FILPBIT_DFLEN) | (1<<FILPBIT_EXTDFLEN)))
&& (ofork->of_flags & AFPFORK_RSRC))
||
( (bitmap & ((1<<FILPBIT_RFLEN) | (1<<FILPBIT_EXTRFLEN)))
&& (ofork->of_flags & AFPFORK_DATA))) {
return( AFPERR_BITMAP );
}
if ( ad_reso_fileno( ofork->of_ad ) == -1 ) { /* META ? */
adp = NULL;
} else {
adp = ofork->of_ad;
}
vol = ofork->of_vol;
dir = dirlookup(vol, ofork->of_did);
if (NULL == (path.u_name = mtoupath(vol, of_name(ofork), dir->d_did, utf8_encoding()))) {
return( AFPERR_MISC );
}
path.m_name = of_name(ofork);
path.id = 0;
st = &path.st;
if ( bitmap & ( (1<<FILPBIT_DFLEN) | (1<<FILPBIT_EXTDFLEN) |
(1<<FILPBIT_FNUM) | (1 << FILPBIT_CDATE) |
(1 << FILPBIT_MDATE) | (1 << FILPBIT_BDATE))) {
if ( ad_data_fileno( ofork->of_ad ) <= 0 ) {
/* 0 is for symlink */
if (movecwd(vol, dir) < 0)
return( AFPERR_NOOBJ );
if ( lstat( path.u_name, st ) < 0 )
return( AFPERR_NOOBJ );
} else {
if ( fstat( ad_data_fileno( ofork->of_ad ), st ) < 0 ) {
return( AFPERR_BITMAP );
}
}
}
return getmetadata(vol, bitmap, &path, dir, buf, buflen, adp );
}
示例8: rst_opendir
/*
* Simulate the opening of a directory
*/
RST_DIR *
rst_opendir(const char *name)
{
struct inotab *itp;
RST_DIR *dirp;
ino_t ino;
if ((ino = dirlookup(name)) > 0 &&
(itp = inotablookup(ino)) != NULL) {
dirp = opendirfile(dirfile);
rst_seekdir(dirp, itp->t_seekpt, itp->t_seekpt);
return (dirp);
}
return (NULL);
}
示例9: strcpy
static struct inode *_name(char *p, int nameiparent, char *dirname)
{
struct inode *in, *next;
char *name;
char arr[64];
char *path = arr;
strcpy(arr, p);
if(*path == '/') {
in = iget(0, 1);
while(*++path == '/')
;
}
else
in = idup(current_proc->cwd);
name = strtok(path, "/");
while(name)
{
// printk("File system search:%s\n", name);
ilock(in);
if(!ISDIR(in->mode))
{
iunlock(in);
iput(in);
return NULL;
}
if(nameiparent && !tok_hasnext())
{
iunlock(in);
if(dirname)
strcpy(dirname, name);
return in;
}
if(!(next = dirlookup(in, name, 0))) {
iunlock(in);
iput(in);
return NULL;
}
iunlock(in);
iput(in);
in = next;
if(!tok_hasnext() && dirname)
strcpy(dirname, name);
name = strtok(NULL, "/");
}
return in;
}
示例10: namex
// Look up and return the inode for a path name.
// If parent != 0, return the inode for the parent and copy the final
// path element into name, which must have room for DIRSIZ bytes.
static struct inode*
namex(char *path, int nameiparent, char *name, int mode) // mode - 0-reference 1-dereference
{
struct inode *ip, *next;
char buf[64];
if(*path == '/')
ip = iget(ROOTDEV, ROOTINO);
else
ip = idup(proc->cwd);
while((path = skipelem(path, name)) != 0){
ilock(ip);
if(ip->type != T_DIR){
iunlockput(ip);
return 0;
}
if(nameiparent && *path == '\0'){
// Stop one level early.
iunlock(ip);
return ip;
}
if((next = dirlookup(ip, name, 0)) == 0){
iunlockput(ip);
return 0;
}
iunlockput(ip);
if(mode || *path!='\0')
{
next= recursive_readlink(buf,next, 16, 0);
}
ip = next;
}
if(nameiparent){
iput(ip);
return 0;
}
return ip;
}
示例11: kernel_create
struct inode*
kernel_create(char *path, short type, short major, short minor)
{
uint off;
struct inode *ip, *dp;
char name[DIRSIZ];
//cprintf("nameiparent path: %s\n",path);
if((dp = nameiparent(path, name)) == 0)
return 0;
ilock(dp);
if((ip = dirlookup(dp, name, &off)) != 0){
iunlockput(dp);
ilock(ip);
if(type == T_FILE && ip->type == T_FILE)
return ip;
iunlockput(ip);
return 0;
}
if((ip = ialloc(dp->dev, type)) == 0)
panic("create: ialloc");
ilock(ip);
ip->major = major;
ip->minor = minor;
ip->nlink = 1;
iupdate(ip);
if(type == T_DIR){ // Create . and .. entries.
dp->nlink++; // for ".."
iupdate(dp);
// No ip->nlink++ for ".": avoid cyclic ref count.
if(dirlink(ip, ".", ip->inum) < 0 || dirlink(ip, "..", dp->inum) < 0)
panic("create dots");
}
if(dirlink(dp, name, ip->inum) < 0)
panic("create: dirlink");
iunlockput(dp);
return ip;
}
示例12: _namei
// Look up and return the inode for a path name.
// If parent != 0, return the inode for the parent and copy the final
// path element into name, which must have room for DIRSIZ bytes.
static struct inode*
_namei(char *path, int parent, char *name)
{
//cprintf("Path: %s\n", path);
struct inode *ip, *next;
if(*path == '/')
ip = iget(ROOTDEV, 1);
else
ip = idup(cp->cwd);
//cprintf("cp name: %s\n", cp->name);
while((path = skipelem(path, name)) != 0){
ilock(ip);
if(ip->type != T_DIR){
iunlockput(ip);
//cprintf("HERE\n");
return 0;
}
if(parent && *path == '\0'){
// Stop one level early.
iunlock(ip);
//cprintf("HERE3\n");
return ip;
}
if((next = dirlookup(ip, name, 0)) == 0){
iunlockput(ip);
//cprintf("HERE1\n");
return 0;
}
iunlockput(ip);
ip = next;
}
if(parent){
iput(ip);
//cprintf("HERE2\n");
return 0;
}
//cprintf("HERE4-2: %d\n", ip);
return ip;
}
示例13: main
//.........这里部分代码省略.........
/*
* Interactive mode.
*/
case 'i':
setup();
extractdirs(1);
initsymtable(NULL);
runcmdshell();
break;
/*
* Incremental restoration of a file system.
*/
case 'r':
setup();
if (dumptime > 0) {
/*
* This is an incremental dump tape.
*/
vprintf(stdout, "Begin incremental restore\n");
initsymtable(symtbl);
extractdirs(1);
removeoldleaves();
vprintf(stdout, "Calculate node updates.\n");
treescan(".", ROOTINO, nodeupdates);
findunreflinks();
removeoldnodes();
} else {
/*
* This is a level zero dump tape.
*/
vprintf(stdout, "Begin level 0 restore\n");
initsymtable((char *)0);
extractdirs(1);
vprintf(stdout, "Calculate extraction list.\n");
treescan(".", ROOTINO, nodeupdates);
}
createleaves(symtbl);
createlinks();
setdirmodes(FORCE);
checkrestore();
if (dflag) {
vprintf(stdout, "Verify the directory structure\n");
treescan(".", ROOTINO, verifyfile);
}
dumpsymtable(symtbl, (long)1);
break;
/*
* Resume an incremental file system restoration.
*/
case 'R':
initsymtable(symtbl);
skipmaps();
skipdirs();
createleaves(symtbl);
createlinks();
setdirmodes(FORCE);
checkrestore();
dumpsymtable(symtbl, (long)1);
break;
/*
* List contents of tape.
*/
case 't':
setup();
extractdirs(0);
initsymtable((char *)0);
while (argc--) {
canon(*argv++, name, sizeof(name));
ino = dirlookup(name);
if (ino == 0)
continue;
treescan(name, ino, listfile);
}
break;
/*
* Batch extraction of tape contents.
*/
case 'x':
setup();
extractdirs(1);
initsymtable((char *)0);
while (argc--) {
canon(*argv++, name, sizeof(name));
ino = dirlookup(name);
if (ino == 0)
continue;
if (mflag)
pathcheck(name);
treescan(name, ino, addfile);
}
createfiles();
createlinks();
setdirmodes(0);
if (dflag)
checkrestore();
break;
}
done(0);
/* NOTREACHED */
}
示例14: extractdirs
/*
* Extract directory contents, building up a directory structure
* on disk for extraction by name.
* If genmode is requested, save mode, owner, and times for all
* directories on the tape.
*/
void
extractdirs(int genmode)
{
int i;
struct inotab *itp;
struct direct nulldir;
int fd;
Vprintf(stdout, "Extract directories from tape\n");
(void)snprintf(dirfile, sizeof(dirfile), "%s/rstdir%d", tmpdir,
dumpdate);
if (command != 'r' && command != 'R') {
strlcat(dirfile, "-XXXXXXXXXX", sizeof(dirfile));
fd = mkstemp(dirfile);
} else
fd = open(dirfile, O_RDWR|O_CREAT|O_EXCL, 0666);
if (fd == -1 || (df = fdopen(fd, "w")) == NULL) {
if (fd != -1)
close(fd);
err(1, "cannot create directory temporary %s", dirfile);
}
if (genmode != 0) {
(void)snprintf(modefile, sizeof(modefile), "%s/rstmode%d",
tmpdir, dumpdate);
if (command != 'r' && command != 'R') {
strlcat(modefile, "-XXXXXXXXXX", sizeof(modefile));
fd = mkstemp(modefile);
} else
fd = open(modefile, O_RDWR|O_CREAT|O_EXCL, 0666);
if (fd == -1 || (mf = fdopen(fd, "w")) == NULL) {
if (fd != -1)
close(fd);
err(1, "cannot create modefile %s", modefile);
}
}
nulldir.d_ino = 0;
nulldir.d_type = DT_DIR;
nulldir.d_namlen = 1;
nulldir.d_name[0] = '/';
nulldir.d_name[1] = '\0';
nulldir.d_reclen = DIRSIZ(0, &nulldir);
for (;;) {
curfile.name = "<directory file - name unknown>";
curfile.action = USING;
if (curfile.mode == 0 || (curfile.mode & IFMT) != IFDIR) {
(void)fclose(df);
dirp = opendirfile(dirfile);
if (dirp == NULL)
warn("opendirfile");
if (mf != NULL)
(void)fclose(mf);
i = dirlookup(dot);
if (i == 0)
panic("Root directory is not on tape\n");
return;
}
itp = allocinotab(mf, &curfile, seekpt);
getfile(putdir, xtrnull);
putent(&nulldir);
flushent();
itp->t_size = seekpt - itp->t_seekpt;
}
}
示例15: makemacpath
/*
* build mac. path (backwards) by traversing the directory tree
*
* The old way: dir and path refer to an app, path is a mac format
* pathname. makemacpath() builds something that looks like a cname,
* but uses upaths instead of mac format paths.
*
* The new way: dir and path refer to an app, path is a mac format
* pathname. makemacpath() builds a cname. (zero is a path separator
* and it's not \0 terminated).
*
* See afp_getappl() for the backward compatiblity code.
*/
static char *
makemacpath(const struct vol *vol, char *mpath, int mpathlen, struct dir *dir, char *path)
{
char *p;
p = mpath + mpathlen;
p -= strlen( path );
memcpy( p, path, strlen( path ));
while ( dir->d_did != DIRDID_ROOT ) {
p -= blength(dir->d_m_name) + 1;
if (p < mpath) {
/* FIXME: pathname too long */
return NULL;
}
memcpy(p, cfrombstr(dir->d_m_name), blength(dir->d_m_name) + 1);
if ((dir = dirlookup(vol, dir->d_pdid)) == NULL)
return NULL;
}
return( p );
#if 0
char buffer[12 + MAXPATHLEN + 1];
int buflen = 12 + MAXPATHLEN + 1;
char *ret = mpath;
char *path = name;
char *uname = NULL;
struct bstrList *pathlist = NULL;
cnid_t cnid = dir->d_pdid;
/* Create list for path elements, request 16 list elements for now*/
if ((pathlist = bstListCreateMin(16)) == NULL) {
LOG(log_error, logtype_afpd, "makemacpath: OOM: %s", strerror(errno));
return NULL;
}
while ( cnid != DIRDID_ROOT ) {
/* construct path, copy already found uname to path element list*/
if ((bstrListPush(pathlist, bfromcstr(path))) != BSTR_OK) {
afp_errno = AFPERR_MISC;
ret = NULL;
goto exit;
}
/* next part */
if ((uname = cnid_resolve(vol->v_cdb, &cnid, buffer, buflen)) == NULL ) {
afp_errno = AFPERR_NOOBJ;
ret = NULL;
goto exit;
}
if ((path = utompath(vol, uname, cnid, utf8_encoding())) == NULL) {
afp_errno = AFPERR_MISC;
ret = NULL;
goto exit;
}
}
exit:
if (pathlist)
bstrListDestroy(pathlist);
return(ret);
#endif
}