// 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); }
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; }