2013-04-09 2 views

답변

4

함수 이름에서 알 수 있듯이 커널 함수 fat_ioctl_get_attributesioctl을 통해 사용자 공간에서 호출되며 다른 바인딩을 인식하지 못합니다. 따라서 다음과 같이 ioctl을 직접 호출하여 속성을 읽을 수 있습니다.

import array 
import fcntl 
import os 

FAT_IOCTL_GET_ATTRIBUTES = 0x80047210 
FATATTR_BITS = 'rhsvda67' 

def get_fat_attrs(fn): 
    fd = os.open(fn, os.O_RDONLY) 
    try: 
     buf = array.array('L', [0]) 
     try: 
      fcntl.ioctl(fd, FAT_IOCTL_GET_ATTRIBUTES, buf, True) 
     except IOError as ioe: 
      if ioe.errno == 25: # Not a FAT volume 
       return None 
      else: 
       raise 

     return buf[0] 
    finally: 
     os.close(fd) 

if __name__ == '__main__': 
    import sys 
    for fn in sys.argv[1:]: 
     attrv = get_fat_attrs(fn) 
     if attrv is None: 
      print(fn + ': Not on a FAT volume') 
      continue 
     s = ''.join((fb if (1 << idx) & attrv else ' ') 
        for idx,fb in enumerate(FATATTR_BITS)) 
     print(fn + ': ' + s) 
+0

메인을 알고 난 후 왜'import sys'입니까? – Serdalis

+1

@Serdalis 다음 줄에서는이 데모 프로그램이 프로그램의 모든 [명령 줄 인수] (http://docs.python.org/3/library/sys.html#sys.argv)를 반복하므로 ' 이 데모 프로그램을 라이브러리로 사용하려면 "sys"가 필요하지 않습니다. – phihag

+0

이 솔루션에 대해 생각해 보았지만 어떻게 함수 주소 (FAT_IOCTL_GET_ATTRIBUTES = 0x80047210)를 얻었습니까? 내 distr에서 나는 "기능이 구현되지 않았습니다"오류가 발생했습니다. – therg