Esempio n. 1
0
// RemoveAttr
status_t
FileHandle::RemoveAttr(const char* name)
{
    if (fFD < 0)
        return B_BAD_VALUE;

    return (fs_remove_attr(fFD, name) == 0 ? B_OK : errno);
}
Esempio n. 2
0
int main(void)
{
	char path[300];
	int code;
	thread_id tid;
	system_info sinfo;
	thread_info tinfo;
	int fd;
	int r;
	struct{
		int lock;
		bigtime_t sessionSN;
		thread_id tid;
	}lockdata;
	
	signal(SIGINT,SIG_IGN);	// protection anti-cons

	get_system_info(&sinfo);

	for(;;){
		code=receive_data(&tid,&path,sizeof path);
		path[sizeof path-1]=0;
		
		fd=open(path,B_READ_WRITE);
		if(fd<0){
			send_data(tid,errno,NULL,0);
			continue;
		}
		
		r=fs_read_attr(fd,AFL_SERVER_NAME,ATTRTYPE,
			0,&lockdata,sizeof lockdata);
		
		switch(code){
		case AFLMSG_LOCK:
			if(r==sizeof lockdata
			&& lockdata.lock
			&& lockdata.sessionSN==sinfo.boot_time
			&& !(get_thread_info(lockdata.tid,&tinfo))){
				// le fichier est déjà vérouillé !
				close(fd);
				send_data(tid,AFLMSG_ISLOCKED,&lockdata.tid,sizeof lockdata.tid);
				break;
			}

			lockdata.lock=1;
			lockdata.sessionSN=sinfo.boot_time;
			lockdata.tid=tid;
			r=fs_write_attr(fd,AFL_SERVER_NAME,ATTRTYPE,
				0,&lockdata,sizeof lockdata);
			close(fd);
			if(r<0)
				send_data(tid,errno,0,NULL);
			else
				send_data(tid,B_OK,0,NULL);
			break;
			
		case AFLMSG_UNLOCK:
			if(r!=sizeof lockdata
			|| !lockdata.lock
			|| lockdata.sessionSN!=sinfo.boot_time
			|| lockdata.tid!=tid){
				// le fichier n'est pas vérouillé par ce thread !
				close(fd);
				send_data(tid,B_PERMISSION_DENIED,0,NULL);
				break;
			}

			r=fs_remove_attr(fd,AFL_SERVER_NAME);
			close(fd);
			if(r<0)
				send_data(tid,errno,0,NULL);
			else
				send_data(tid,B_OK,0,NULL);
			break;
			
		default:
			close(fd);
			send_data(tid,B_BAD_VALUE,0,NULL);
		}
	}
	
	return 0;
}