本文整理汇总了C++中dirlookup函数的典型用法代码示例。如果您正苦于以下问题:C++ dirlookup函数的具体用法?C++ dirlookup怎么用?C++ dirlookup使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了dirlookup函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的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);
}
开发者ID:NTmatter,项目名称:Netatalk,代码行数:59,代码来源:test.c
示例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;
}
开发者ID:guneetsinghmehta,项目名称:CS537_OS,代码行数:37,代码来源:fs.c
示例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;
}
开发者ID:CoryXie,项目名称:nix-os,代码行数:30,代码来源:namedtube.c
示例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;
}
开发者ID:Turingwy,项目名称:turinux,代码行数:26,代码来源:dirent.c
示例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;
}
开发者ID:gaohannk,项目名称:xv6-system,代码行数:29,代码来源:fs.c
示例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;
}
开发者ID:yonatana,项目名称:OS,代码行数:55,代码来源:proc.c
示例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 );
}
开发者ID:SaM-Solutions,项目名称:netatalk,代码行数:51,代码来源:fork.c
示例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);
}
开发者ID:sofuture,项目名称:bitrig,代码行数:18,代码来源:dirs.c
示例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;
}
开发者ID:Turingwy,项目名称:turinux,代码行数:47,代码来源:dirent.c
示例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;
}
开发者ID:ashual,项目名称:xv6-ass4,代码行数:49,代码来源:fs.c
示例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;
}
开发者ID:yonatana,项目名称:OS,代码行数:43,代码来源:proc.c
示例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;
}
开发者ID:fenster,项目名称:xv6-staus-treffert,代码行数:45,代码来源:fs.c
示例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 */
}
开发者ID:MattDooner,项目名称:freebsd-west,代码行数:101,代码来源:main.c
示例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;
}
}
开发者ID:sofuture,项目名称:bitrig,代码行数:69,代码来源:dirs.c
示例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
}
开发者ID:hajuuk,项目名称:R7000,代码行数:82,代码来源:appl.c
示例16: private_demangle
/* -------------------------------------------------------
*/
static char *
private_demangle(const struct vol *vol, char *mfilename, cnid_t did, cnid_t *osx)
{
char *t;
char *u_name;
uint32_t id, file_id;
static char buffer[12 + MAXPATHLEN + 1];
int len = 12 + MAXPATHLEN + 1;
struct dir *dir;
size_t prefix;
id = file_id = 0;
t = strchr(mfilename, MANGLE_CHAR);
if (t == NULL) {
return mfilename;
}
prefix = t - mfilename;
/* FIXME
* is prefix == 0 a valid mangled filename ?
*/
/* may be a mangled filename */
t++;
if (*t == '0') { /* can't start with a 0 */
return mfilename;
}
while(isuxdigit(*t)) {
id = (id *16) + hextoint(*t);
t++;
}
if ((*t != 0 && *t != '.') || strlen(t) > MAX_EXT_LENGTH || id < 17) {
return mfilename;
}
file_id = id = htonl(id);
if (osx) {
*osx = id;
}
/* is it a dir?, there's a conflict with pre OSX 'trash #2' */
if ((dir = dirlookup(vol, id))) {
if (dir->d_pdid != did) {
/* not in the same folder, there's a race with outdate cache
* but we have to live with it, hopefully client will recover
*/
return mfilename;
}
if (!osx) {
/* it's not from cname so mfilename and dir must be the same */
if (strcmp(cfrombstr(dir->d_m_name), mfilename) == 0) {
return cfrombstr(dir->d_u_name);
}
} else {
return demangle_checks(vol, cfrombstr(dir->d_u_name), mfilename, prefix, t);
}
}
else if (NULL != (u_name = cnid_resolve(vol->v_cdb, &id, buffer, len)) ) {
if (id != did) {
return mfilename;
}
if (!osx) {
/* convert back to mac name and check it's the same */
t = utompath(vol, u_name, file_id, utf8_encoding(vol->v_obj));
if (!strcmp(t, mfilename)) {
return u_name;
}
}
else {
return demangle_checks (vol, u_name, mfilename, prefix, t);
}
}
return mfilename;
}
开发者ID:Distrotech,项目名称:netatalk,代码行数:76,代码来源:mangle.c
示例17: namex
//part 1 - signature change, and de-referencing symbolic links to the correct inode
struct inode*
namex(char *path, int nameiparent, char *name,
struct inode *prev, int loopCount,int noDeRef)
{
struct inode *ip, *next;
char buf[512];
// part 1 - prevent loop in symbolic links
if(loopCount > 16)
return 0;
if(*path == '/') {
ip = iget(ROOTDEV, ROOTINO);
} else if(prev) {
ip = idup(prev);
} 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;
}
if(noDeRef) {
iunlockput(ip);
} else {
iunlock(ip);
//part 1
ilock(next);
if(next->type == T_SYMLINK) {
if(readi(next, buf, 0, sizeof(buf)) != next->size) {
iunlockput(ip);
return 0;
}
buf[next->size] = 0;
iunlock(next);
next = namex(buf, 0, name, ip, loopCount++,0);
} else {
iunlock(next);
}
// End part 1
iput(ip);
}
ip = next;
}
if(nameiparent) {
iput(ip);
return 0;
}
return ip;
}
开发者ID:eldardamari,项目名称:operatingSystems,代码行数:67,代码来源:fs.c
示例18: catsearch_db
/*!
* This function performs a CNID db search
*
* Uses globals c1, c2, the search criteria
*
* @param vol (r) volume we are searching on ...
* @param dir (rw) directory we are starting from ...
* @param uname (r) UNIX name of object to search
* @param rmatches (r) maximum number of matches we can return
* @param pos (r) position we've stopped recently
* @param rbuf (w) output buffer
* @param nrecs (w) number of matches
* @param rsize (w) length of data written to output buffer
* @param ext (r) extended search flag
*/
static int catsearch_db(struct vol *vol,
struct dir *dir,
const char *uname,
int rmatches,
uint32_t *pos,
char *rbuf,
uint32_t *nrecs,
int *rsize,
int ext)
{
static char resbuf[DBD_MAX_SRCH_RSLTS * sizeof(cnid_t)];
static uint32_t cur_pos;
static int num_matches;
int ccr ,r;
int result = AFP_OK;
struct path path;
char *rrbuf = rbuf;
char buffer[MAXPATHLEN +2];
uint16_t flags = CONV_TOLOWER;
LOG(log_debug, logtype_afpd, "catsearch_db(req pos: %u): {pos: %u, name: %s}",
*pos, cur_pos, uname);
if (*pos != 0 && *pos != cur_pos) {
result = AFPERR_CATCHNG;
goto catsearch_end;
}
if (cur_pos == 0 || *pos == 0) {
if (convert_charset(vol->v_volcharset,
vol->v_volcharset,
vol->v_maccharset,
uname,
strlen(uname),
buffer,
MAXPATHLEN,
&flags) == (size_t)-1) {
LOG(log_error, logtype_afpd, "catsearch_db: conversion error");
result = AFPERR_MISC;
goto catsearch_end;
}
LOG(log_debug, logtype_afpd, "catsearch_db: %s", buffer);
if ((num_matches = cnid_find(vol->v_cdb,
buffer,
strlen(uname),
resbuf,
sizeof(resbuf))) == -1) {
result = AFPERR_MISC;
goto catsearch_end;
}
}
while (cur_pos < num_matches) {
char *name;
cnid_t cnid, did;
char resolvebuf[12 + MAXPATHLEN + 1];
struct dir *dir;
/* Next CNID to process from buffer */
memcpy(&cnid, resbuf + cur_pos * sizeof(cnid_t), sizeof(cnid_t));
did = cnid;
if ((name = cnid_resolve(vol->v_cdb, &did, resolvebuf, 12 + MAXPATHLEN + 1)) == NULL)
goto next;
LOG(log_debug, logtype_afpd, "catsearch_db: {pos: %u, name:%s, cnid: %u}",
cur_pos, name, ntohl(cnid));
if ((dir = dirlookup(vol, did)) == NULL)
goto next;
if (movecwd(vol, dir) < 0 )
goto next;
memset(&path, 0, sizeof(path));
path.u_name = name;
path.m_name = utompath(vol, name, cnid, utf8_encoding());
if (of_stat(vol, &path) != 0) {
switch (errno) {
case EACCES:
case ELOOP:
goto next;
case ENOENT:
default:
//.........这里部分代码省略.........
开发者ID:hajuuk,项目名称:R7000,代码行数:101,代码来源:catsearch.c
示例19: catsearch
static int catsearch(struct vol *vol,
struct dir *dir,
int rmatches,
uint32_t *pos,
char *rbuf,
uint32_t *nrecs,
int *rsize,
int ext)
{
static u_int32_t cur_pos; /* Saved position index (ID) - used to remember "position" across FPCatSearch calls */
static DIR *dirpos; /* UNIX structure describing currently opened directory. */
struct dir *currentdir; /* struct dir of current directory */
int cidx, r;
struct dirent *entry;
int result = AFP_OK;
int ccr;
struct path path;
char *vpath = vol->v_path;
char *rrbuf = rbuf;
time_t start_time;
int num_rounds = NUM_ROUNDS;
int cwd = -1;
int error;
int unlen;
if (*pos != 0 && *pos != cur_pos) {
result = AFPERR_CATCHNG;
goto catsearch_end;
}
/* FIXME: Category "offspring count ! */
/* We need to initialize all mandatory structures/variables and change working directory appropriate... */
if (*pos == 0) {
clearstack();
if (dirpos != NULL) {
closedir(dirpos);
dirpos = NULL;
}
if (addstack(vpath, dir, -1) == -1) {
result = AFPERR_MISC;
goto catsearch_end;
}
/* FIXME: Sometimes DID is given by client ! (correct this one above !) */
}
/* Save current path */
if ((cwd = open(".", O_RDONLY)) < 0) {
result = AFPERR_MISC;
goto catsearch_end;
}
/* So we are beginning... */
start_time = time(NULL);
while ((cidx = reducestack()) != -1) {
if ((currentdir = dirlookup(vol, dstack[cidx].ds_did)) == NULL) {
result = AFPERR_MISC;
goto catsearch_end;
}
LOG(log_debug, logtype_afpd, "catsearch: current struct dir: \"%s\"", cfrombstr(currentdir->d_fullpath));
error = movecwd(vol, currentdir);
if (!error && dirpos == NULL)
dirpos = opendir(".");
if (dirpos == NULL)
dirpos = opendir(bdata(currentdir->d_fullpath));
if (error || dirpos == NULL) {
switch (errno) {
case EACCES:
dstack[cidx].ds_checked = 1;
continue;
case EMFILE:
case ENFILE:
case ENOENT:
result = AFPERR_NFILE;
break;
case ENOMEM:
case ENOTDIR:
default:
result = AFPERR_MISC;
} /* switch (errno) */
goto catsearch_end;
}
while ((entry = readdir(dirpos)) != NULL) {
(*pos)++;
if (!check_dirent(vol, entry->d_name))
continue;
LOG(log_debug, logtype_afpd, "catsearch(\"%s\"): dirent: \"%s\"",
cfrombstr(currentdir->d_fullpath), entry->d_name);
//.........这里部分代码省略.........
开发者ID:hajuuk,项目名称:R7000,代码行数:101,代码来源:catsearch.c
示例20: 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 ufs1_dinode *ip;
struct inotab *itp;
struct direct nulldir;
int fd;
const char *tmpdir;
vprintf(stdout, "Extract directories from tape\n");
if ((tmpdir = getenv("TMPDIR")) == NULL || tmpdir[0] == '\0')
tmpdir = _PATH_TMP;
sprintf(dirfile, "%s/rstdir%ld", tmpdir, (long)dumpdate);
if (command != 'r' && command != 'R') {
(void *) strcat(dirfile, "-XXXXXX");
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);
warn("%s - cannot create directory temporary\nfopen", dirfile);
done(1);
}
if (genmode != 0) {
sprintf(modefile, "%s/rstmode%ld", tmpdir, (long)dumpdate);
if (command != 'r' && command != 'R') {
(void *) strcat(modefile, "-XXXXXX");
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);
warn("%s - cannot create modefile\nfopen", modefile);
done(1);
}
}
nulldir.d_ino = 0;
nulldir.d_type = DT_DIR;
nulldir.d_namlen = 1;
strcpy(nulldir.d_name, "/");
nulldir.d_reclen = DIRSIZ(0, &nulldir);
for (;;) {
curfile.name = "<directory file - name unknown>";
curfile.action = USING;
ip = curfile.dip;
if (ip == NULL || (ip->di_mode & IFMT) != IFDIR) {
fclose(df);
dirp = opendirfile(dirfile);
if (dirp == NULL)
fprintf(stderr, "opendirfile: %s\n",
strerror(errno));
if (mf != NULL)
fclose(mf);
i = dirlookup(dot);
if (i == 0)
panic("Root directory is not on tape\n");
return;
}
itp = allocinotab(curfile.ino, ip, seekpt);
getfile(putdir, xtrnull);
putent(&nulldir);
flushent();
itp->t_size = seekpt - itp->t_seekpt;
}
}
开发者ID:AhmadTux,项目名称:DragonFlyBSD,代码行数:74,代码来源:dirs.c
注:本文中的dirlookup函数示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论