2017-01-26 2 views
0

저는 리눅스 커널 용 모듈을 쓰고 있습니다.sysfs_create_file()의 권한을 나중에 변경하는 방법은 무엇입니까?

이 모듈은 파일 /sys/kernel/mymodule/foo 일부 I/O를 노출한다 : 일부 데이터가 /sys/kernel/mymodule/foo에 기록 된 나는 즉시 0440에 0660 권한을 변경할 수 있도록하려면

static struct kobj_attribute foo_attribute =__ATTR(foo, 0660, foo_show, foo_store); 
...   
ret = sysfs_create_file(&mymodule->kobj, &foo_attribute.attr); 

. 나는 foo_store() 함수에서 이것을 할 것이다.

__ATTR 매크로를 조사했습니다. 코드가 폭발적으로 생성되어 대부분 사용 권한을 조작합니다. 위 코드는 모듈 디렉토리의 gcc -E mymodule.c -I../../include -I../../arch/arm/include -I../../arch/arm/include/generated을 사용하여

static struct foo_attribute = { .attr = {.name = "foo", .mode = ((sizeof(struct { int:-!!((0660) < 0); })) + (sizeof(struct { int:-!!((0660) > 0777); })) + (sizeof(struct { int:-!!(((0660) >> 6) < (((0660) >> 3) & 7)); })) + (sizeof(struct { int:-!!((((0660) >> 3) & 7) < ((0660) & 7)); })) + (sizeof(struct { int:-!!((0660) & 2); })) + (0660)) }, .show = foo_show, .store = foo_store, }; 
... 
ret = sysfs_create_file(&vr2200pmu->kobj, &revision_attribute.attr); 

으로 확장됩니다.

깨끗한 상태로 이걸 어떻게 실현할 수 있습니까? 휴대용?

+0

은 컴파일 시간을 사용 권한을 확인하는'를 sizeof 연산자를 사용하여 (단순히 'whatever'가 0이 아닌 경우 컴파일 타임 오류 (음수 길이 비트 필드)가 발생합니다. struct {int : - !! (whatever);})' – fadedbee

+0

권한 유효성을 검사하는'BUILD_BUG_ON_ZERO' 매크로 호출입니다. [커널 소스 파일] (http://lxr.free-electrons.com/source/include/linux/sysfs.h#L100)에서'__ATTR()'매크로 정의를 살펴보십시오. – Tsyvarev

답변

1

확실, 그것은 여부 프로그래밍 sysfs를 파일 권한을 수정하기위한 방법을 구성,하지만이 작동합니다 :

그것은 매크로처럼 보이는
// Obtain kernfs object for directory 
struct kernfs_node* dir_knode = kobj->sd; 
// Obtain kernfs object for file in the directory 
struct kernfs_node* file_knode = sysfs_get_dirent(dir_knode, foo_attr.attr.name); 
// Change permissions. Set only permissions-related bits. 
file_knode->mode = (file_knode->mode & S_IFMT) | 0440; 
관련 문제