github.com/minio/mc@v0.0.0-20240503112107-b471de8d1882/cmd/client-fs_freebsd.go (about)

     1  // Copyright (c) 2015-2022 MinIO, Inc.
     2  //
     3  // This file is part of MinIO Object Storage stack
     4  //
     5  // This program is free software: you can redistribute it and/or modify
     6  // it under the terms of the GNU Affero General Public License as published by
     7  // the Free Software Foundation, either version 3 of the License, or
     8  // (at your option) any later version.
     9  //
    10  // This program is distributed in the hope that it will be useful
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13  // GNU Affero General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU Affero General Public License
    16  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    17  
    18  package cmd
    19  
    20  import (
    21  	"github.com/pkg/xattr"
    22  	"github.com/rjeczalik/notify"
    23  )
    24  
    25  var (
    26  	// EventTypePut contains the notify events that will cause a put (writer)
    27  	EventTypePut = []notify.Event{notify.Create, notify.Write, notify.Rename}
    28  	// EventTypeDelete contains the notify events that will cause a delete (remove)
    29  	EventTypeDelete = []notify.Event{notify.Remove}
    30  	// EventTypeGet contains the notify events that will cause a get (read)
    31  	EventTypeGet = []notify.Event{} // On macOS, FreeBSD, Solaris this is not available.
    32  )
    33  
    34  // IsGetEvent checks if the event return is a get event.
    35  func IsGetEvent(event notify.Event) bool {
    36  	return false
    37  }
    38  
    39  // IsPutEvent checks if the event returned is a put event
    40  func IsPutEvent(event notify.Event) bool {
    41  	for _, ev := range EventTypePut {
    42  		if event&ev != 0 {
    43  			return true
    44  		}
    45  	}
    46  	return false
    47  }
    48  
    49  // IsDeleteEvent checks if the event returned is a delete event
    50  func IsDeleteEvent(event notify.Event) bool {
    51  	return event&notify.Remove != 0
    52  }
    53  
    54  // getXAttr fetches the extended attribute for a particular key on
    55  // file
    56  func getXAttr(path, key string) (string, error) {
    57  	data, e := xattr.Get(path, key)
    58  	if e != nil {
    59  		return "", e
    60  	}
    61  	return string(data), nil
    62  }
    63  
    64  // getAllXattrs returns the extended attributes for a file if supported
    65  // by the OS
    66  func getAllXattrs(path string) (map[string]string, error) {
    67  	xMetadata := make(map[string]string)
    68  	list, e := xattr.List(path)
    69  	if e != nil {
    70  		if isNotSupported(e) {
    71  			return nil, nil
    72  		}
    73  		return nil, e
    74  	}
    75  	for _, key := range list {
    76  		xMetadata[key], e = getXAttr(path, key)
    77  		if e != nil {
    78  			if isNotSupported(e) {
    79  				return nil, nil
    80  			}
    81  			return nil, e
    82  		}
    83  
    84  	}
    85  	return xMetadata, nil
    86  }