int fileSetDir(File *f, DirEntry *dir, char *uid) { File *ff; char *oelem; u32int mask; u64int size; /* can not set permissions for the root */ if(fileIsRoot(f)){ vtSetError(ERoot); return 0; } if(!fileLock(f)) return 0; if(f->source->mode != OReadWrite){ vtSetError(EReadOnly); fileUnlock(f); return 0; } fileMetaLock(f); /* check new name does not already exist */ if(strcmp(f->dir.elem, dir->elem) != 0){ for(ff = f->up->down; ff; ff=ff->next){ if(strcmp(dir->elem, ff->dir.elem) == 0 && !ff->removed){ vtSetError(EExists); goto Err; } } ff = dirLookup(f->up, dir->elem); if(ff != nil){ fileDecRef(ff); vtSetError(EExists); goto Err; } } if(!sourceLock2(f->source, f->msource, -1)) goto Err; if(!fileIsDir(f)){ size = sourceGetSize(f->source); if(size != dir->size){ if(!sourceSetSize(f->source, dir->size)){ sourceUnlock(f->source); if(f->msource) sourceUnlock(f->msource); goto Err; } /* commited to changing it now */ } } /* commited to changing it now */ if((f->dir.mode&ModeTemporary) != (dir->mode&ModeTemporary)) fileSetTmp(f, dir->mode&ModeTemporary); sourceUnlock(f->source); if(f->msource) sourceUnlock(f->msource); oelem = nil; if(strcmp(f->dir.elem, dir->elem) != 0){ oelem = f->dir.elem; f->dir.elem = vtStrDup(dir->elem); } if(strcmp(f->dir.uid, dir->uid) != 0){ vtMemFree(f->dir.uid); f->dir.uid = vtStrDup(dir->uid); } if(strcmp(f->dir.gid, dir->gid) != 0){ vtMemFree(f->dir.gid); f->dir.gid = vtStrDup(dir->gid); } f->dir.mtime = dir->mtime; f->dir.atime = dir->atime; //fprint(2, "mode %x %x ", f->dir.mode, dir->mode); mask = ~(ModeDir|ModeSnapshot); f->dir.mode &= ~mask; f->dir.mode |= mask & dir->mode; f->dirty = 1; //fprint(2, "->%x\n", f->dir.mode); fileMetaFlush2(f, oelem); vtMemFree(oelem); fileMetaUnlock(f); fileUnlock(f); fileWAccess(f->up, uid); return 1; Err: fileMetaUnlock(f); fileUnlock(f); return 0; }
File * _fileWalk(File *f, char *elem, int partial) { File *ff; fileRAccess(f); if(elem[0] == 0){ vtSetError(EBadPath); return nil; } if(!fileIsDir(f)){ vtSetError(ENotDir); return nil; } if(strcmp(elem, ".") == 0){ return fileIncRef(f); } if(strcmp(elem, "..") == 0){ if(fileIsRoot(f)) return fileIncRef(f); return fileIncRef(f->up); } if(!fileLock(f)) return nil; for(ff = f->down; ff; ff=ff->next){ if(strcmp(elem, ff->dir.elem) == 0 && !ff->removed){ ff->ref++; goto Exit; } } ff = dirLookup(f, elem); if(ff == nil) goto Err; if(ff->dir.mode & ModeSnapshot){ ff->mode = OReadOnly; ff->issnapshot = 1; } if(partial){ /* * Do nothing. We're opening this file only so we can clri it. * Usually the sources can't be opened, hence we won't even bother. * Be VERY careful with the returned file. If you hand it to a routine * expecting ff->source and/or ff->msource to be non-nil, we're * likely to dereference nil. FileClri should be the only routine * setting partial. */ ff->partial = 1; }else if(ff->dir.mode & ModeDir){ ff->source = fileOpenSource(f, ff->dir.entry, ff->dir.gen, 1, ff->mode, ff->issnapshot); ff->msource = fileOpenSource(f, ff->dir.mentry, ff->dir.mgen, 0, ff->mode, ff->issnapshot); if(ff->source == nil || ff->msource == nil) goto Err; }else{ ff->source = fileOpenSource(f, ff->dir.entry, ff->dir.gen, 0, ff->mode, ff->issnapshot); if(ff->source == nil) goto Err; } /* link in and up parent ref count */ if (ff->source) ff->source->file = ff; /* point back */ ff->next = f->down; f->down = ff; ff->up = f; fileIncRef(f); Exit: fileUnlock(f); return ff; Err: fileUnlock(f); if(ff != nil) fileDecRef(ff); return nil; }
File * fileCreate(File *f, char *elem, ulong mode, char *uid) { File *ff; DirEntry *dir; Source *pr, *r, *mr; int isdir; if(!fileLock(f)) return nil; r = nil; mr = nil; for(ff = f->down; ff; ff=ff->next){ if(strcmp(elem, ff->dir.elem) == 0 && !ff->removed){ ff = nil; vtSetError(EExists); goto Err1; } } ff = dirLookup(f, elem); if(ff != nil){ vtSetError(EExists); goto Err1; } pr = f->source; if(pr->mode != OReadWrite){ vtSetError(EReadOnly); goto Err1; } if(!sourceLock2(f->source, f->msource, -1)) goto Err1; ff = fileAlloc(f->fs); isdir = mode & ModeDir; r = sourceCreate(pr, pr->dsize, isdir, 0); if(r == nil) goto Err; if(isdir){ mr = sourceCreate(pr, pr->dsize, 0, r->offset); if(mr == nil) goto Err; } dir = &ff->dir; dir->elem = vtStrDup(elem); dir->entry = r->offset; dir->gen = r->gen; if(isdir){ dir->mentry = mr->offset; dir->mgen = mr->gen; } dir->size = 0; if(!fsNextQid(f->fs, &dir->qid)) goto Err; dir->uid = vtStrDup(uid); dir->gid = vtStrDup(f->dir.gid); dir->mid = vtStrDup(uid); dir->mtime = time(0L); dir->mcount = 0; dir->ctime = dir->mtime; dir->atime = dir->mtime; dir->mode = mode; ff->boff = fileMetaAlloc(f, dir, 0); if(ff->boff == NilBlock) goto Err; sourceUnlock(f->source); sourceUnlock(f->msource); ff->source = r; r->file = ff; /* point back */ ff->msource = mr; if(mode&ModeTemporary){ if(!sourceLock2(r, mr, -1)) goto Err1; fileSetTmp(ff, 1); sourceUnlock(r); if(mr) sourceUnlock(mr); } /* committed */ /* link in and up parent ref count */ ff->next = f->down; f->down = ff; ff->up = f; fileIncRef(f); fileWAccess(f, uid); fileUnlock(f); return ff; Err: sourceUnlock(f->source); sourceUnlock(f->msource); Err1: if(r){ sourceLock(r, -1); sourceRemove(r); } if(mr){ sourceLock(mr, -1); sourceRemove(mr); } if(ff) fileDecRef(ff); fileUnlock(f); return 0; }
FaxPanel::FaxPanel(QWidget *parent) : XLet(parent), m_mainwindow(parent) { // qDebug() << Q_FUNC_INFO << parent; setTitle( tr("Fax") ); QVBoxLayout * vlayout = new QVBoxLayout(this); // QGroupBox * groupBox1 = new QGroupBox( tr("Choose Destination Number") ); groupBox1->setAlignment( Qt::AlignLeft ); QHBoxLayout * hbox1 = new QHBoxLayout( groupBox1 ); QLabel * lblfax = new QLabel(tr("Fax Number"), this); m_destination = new QLineEdit(this); QPushButton * directory = new QPushButton( tr("Directory"), this); connect(directory, SIGNAL(clicked()), this, SLOT(dirLookup())); connect(m_destination, SIGNAL(textChanged(const QString &)), this, SLOT(destNumberChanged(const QString &))); hbox1->addWidget(lblfax); hbox1->addWidget(m_destination); hbox1->addWidget(directory); lblfax->setObjectName("fax"); // QGroupBox * groupBox2 = new QGroupBox( tr("Choose File to Send") ); groupBox2->setAlignment( Qt::AlignLeft ); QHBoxLayout * hbox2 = new QHBoxLayout( groupBox2 ); m_openFileNameLabel = new FileNameLineEdit(this); connect(m_openFileNameLabel, SIGNAL(textChanged(const QString &)), this, SLOT(fileNameChanged(const QString &))); QPushButton * openFileNamesButton = new QPushButton( tr("Browse"), this); connect(openFileNamesButton, SIGNAL(clicked()), this, SLOT(setOpenFileName())); hbox2->addWidget(m_openFileNameLabel); hbox2->addWidget(openFileNamesButton); // QGroupBox * groupBox3 = new QGroupBox( tr("Hide the Number ?") ); groupBox3->setAlignment( Qt::AlignLeft ); QHBoxLayout * hbox3 = new QHBoxLayout( groupBox3 ); m_maskornot = new QCheckBox(tr("Hide Number"), this); //int previous_hide = b_engine->getSettings()->value("faxhistory/hidenumber", 0).toUInt(); //m_maskornot->setCheckState((Qt::CheckState)previous_hide); m_maskornot->setCheckState(Qt::Unchecked); hbox3->addStretch(1); hbox3->addWidget(m_maskornot); hbox3->addStretch(1); // QGroupBox * groupBox4 = new QGroupBox( tr("Send your File") ); groupBox4->setAlignment( Qt::AlignLeft ); QHBoxLayout * hbox4 = new QHBoxLayout( groupBox4 ); m_sendButton = new QPushButton( tr("Send"), this); m_sendButton->setEnabled(false); connect(m_sendButton, SIGNAL(clicked()), this, SLOT(sendFax())); hbox4->addStretch(1); hbox4->addWidget(m_sendButton); hbox4->addStretch(1); vlayout->addWidget(groupBox1); vlayout->addWidget(groupBox2); //vlayout->addWidget(groupBox3); vlayout->addWidget(groupBox4); vlayout->addStretch(1); // connect signals / slots connect( b_engine, SIGNAL(ackFax(const QString &, const QString &)), this, SLOT(popupMsg(const QString &, const QString &)) ); }