C에서 파일의 확장 된 속성 가져 오기

Jinku Hu 2023년10월12일
  1. getxattrlistxattr함수를 사용하여 파일의 확장 된 속성 가져 오기
  2. setxattr함수를 사용하여 파일에 대한 확장 속성 설정
C에서 파일의 확장 된 속성 가져 오기

이 기사에서는 C에서 파일의 확장 된 속성을 얻는 방법에 대한 몇 가지 방법을 설명합니다.

getxattrlistxattr함수를 사용하여 파일의 확장 된 속성 가져 오기

일부 UNIX 기반 시스템은 파일에 연결할 수있는 메타 데이터의 이름-값 쌍을 나타내는 확장 된 속성을 파일에 제공합니다. 확장 속성에는 기본 파일 시스템 지원이 필요하지만 일반적인 파일 시스템 유형에는이 기능이 있습니다. 확장 된 속성은namespace.name유형의 특정 형식을 갖습니다. 여기서namespace는 기능적으로 유사한 항목을 그룹화하는 데 사용되는 반면name부분은 개별 확장 된 속성을 식별합니다. 네임 스페이스는user,trusted,systemsecurity값을 가질 수 있습니다.이 값은 여러 권한 유형을 규칙으로 구분합니다 (페이지에 자세히 설명되어 있습니다.). 이 경우 여러 파일 이름을 명령 줄 인수로 사용하고 결과적으로 각 파일에 대한 모든 확장 속성을 검색하는 예제 프로그램을 구현합니다. 프로그램은getopt함수를 사용하여 여러 파일 인수를 처리합니다.

getxattr함수는 확장 된 속성 값을 검색하기 위해 4 개의 인수를 사용합니다. 첫 번째 인수는 EA를 검색해야하는 파일을 나타내는 파일 시스템의 경로를 지정하고 두 번째 인수는 속성 이름을 지정합니다. 마지막 두 인수는getxattr에 의해 값이 저장 될 위치에 대한 포인터와이 주소에서 사용 가능한 버퍼 크기입니다. 속성 값의 크기는0값을 크기 인수로 전달하여 검색 할 수 있으며 호출의 리턴 값은 필요한 버퍼의 바이트 수입니다. 값을 검색하기 위해 두 번째 호출이 호출 될 때 값이 변경되고 크기가 다를 수 있습니다. 따라서 오류없는 실행을 보장하기 위해 오류 코드를 확인하는 것이 좋습니다.

반면listxattr함수는 주어진 파일 경로에 대한 확장 된 속성 이름 목록을 검색합니다. 세 개의 인수를 사용하며 첫 번째 인수는 파일 경로입니다. 다음 두 인수는 검색된 목록이 저장 될 버퍼와 바이트 단위로 지정된 크기를 나타냅니다. 이 버퍼는 호출자 할당이며 호출자는 충분한 메모리를 할당해야합니다. 또한getxattr과 유사하게0값을이 함수의 세 번째 인수로 전달할 수 있으며 반환 된 값은 전체 목록을 저장하는 데 필요한 버퍼 크기가됩니다.

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/xattr.h>
#include <unistd.h>

#define XATTR_SIZE 10000

#define errExit(msg)    \
  do {                  \
    perror(msg);        \
    exit(EXIT_FAILURE); \
  } while (0)

static void usageError(char *progName) {
  fprintf(stderr, "Usage: %s [-x] file...\n", progName);
  exit(EXIT_FAILURE);
}

int main(int argc, char *argv[]) {
  char list[XATTR_SIZE], value[XATTR_SIZE];
  ssize_t listLen, valueLen;
  int ns, j, k, opt;
  bool hexDisplay;

  hexDisplay = 0;
  while ((opt = getopt(argc, argv, "x")) != -1) {
    switch (opt) {
      case 'x':
        hexDisplay = 1;
        break;
      case '?':
        usageError(argv[0]);
    }
  }

  if (optind >= argc) usageError(argv[0]);

  for (j = optind; j < argc; j++) {
    listLen = listxattr(argv[j], list, XATTR_SIZE);
    if (listLen == -1) errExit("listxattr");

    printf("%s:\n", argv[j]);

    for (ns = 0; ns < listLen; ns += strlen(&list[ns]) + 1) {
      printf("        name=%s; ", &list[ns]);

      valueLen = getxattr(argv[j], &list[ns], value, XATTR_SIZE);
      if (valueLen == -1) {
        printf("couldn't get value");
      } else if (!hexDisplay) {
        printf("value=%.*s", (int)valueLen, value);
      } else {
        printf("value=");
        for (k = 0; k < valueLen; k++) printf("%02x ", (unsigned char)value[k]);
      }

      printf("\n");
    }

    printf("\n");
  }

  exit(EXIT_SUCCESS);
}

setxattr함수를 사용하여 파일에 대한 확장 속성 설정

또는setxattr함수를 사용하여 파일에 임의의 속성을 설정할 수 있습니다.이 함수는 파일의 경로 이름, 이름-값 쌍을 별도의 인수, 값의 크기, 다른 집합 작업에 대해 미리 정의 된 값을 지정하는 정수로 사용합니다. 마지막 인수가 기본값 인 0 인 경우 확장 된 속성이 없으면 생성됩니다. 그렇지 않으면 값이 대체됩니다. XATTR_CREATE매크로는 속성이 존재하면 실패하는 작성 옵션 만 표시하고 속성이 존재하지 않는 경우 실패하는 대체를 수행하려면XATTR_REPLACE를 지정하도록 지정할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/xattr.h>

#define errExit(msg)    \
  do {                  \
    perror(msg);        \
    exit(EXIT_FAILURE); \
  } while (0)

static void usageError(char *progName) {
  fprintf(stderr, "Usage: %s file\n", progName);
  exit(EXIT_FAILURE);
}

int main(int argc, char *argv[]) {
  char *value;

  if (argc < 2 || strcmp(argv[1], "--help") == 0) usageError(argv[0]);

  value = "x attribute value";
  if (setxattr(argv[1], "user.x", value, strlen(value), 0) == -1)
    errExit("setxattr");

  value = "y attribute value";
  if (setxattr(argv[1], "user.y", value, strlen(value), 0) == -1)
    errExit("setxattr");

  exit(EXIT_SUCCESS);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C File