- Set and get user property
This commit is contained in:
		
							parent
							
								
									5411c35d4b
								
							
						
					
					
						commit
						fe36016d7e
					
				
							
								
								
									
										41
									
								
								zfs.c
								
								
								
								
							
							
						
						
									
										41
									
								
								zfs.c
								
								
								
								
							| 
						 | 
					@ -82,6 +82,47 @@ int read_dataset_property(zfs_handle_t *zh, property_list_t *list, int prop) {
 | 
				
			||||||
	return r;
 | 
						return r;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int read_user_property(zfs_handle_t *zh, property_list_t *list, const char *prop) {
 | 
				
			||||||
 | 
						nvlist_t *user_props = zfs_get_user_props(zh);
 | 
				
			||||||
 | 
						nvlist_t *propval;
 | 
				
			||||||
 | 
						zprop_source_t sourcetype;
 | 
				
			||||||
 | 
						char *strval;
 | 
				
			||||||
 | 
						char *sourceval;
 | 
				
			||||||
 | 
						// char source[ZFS_MAX_DATASET_NAME_LEN];
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (nvlist_lookup_nvlist(user_props,
 | 
				
			||||||
 | 
							prop, &propval) != 0) {
 | 
				
			||||||
 | 
							sourcetype = ZPROP_SRC_NONE;
 | 
				
			||||||
 | 
							(void) strncpy(list->source,
 | 
				
			||||||
 | 
									"none", sizeof (list->source));
 | 
				
			||||||
 | 
							strval = "-";
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							verify(nvlist_lookup_string(propval,
 | 
				
			||||||
 | 
								ZPROP_VALUE, &strval) == 0);
 | 
				
			||||||
 | 
							verify(nvlist_lookup_string(propval,
 | 
				
			||||||
 | 
								ZPROP_SOURCE, &sourceval) == 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (strcmp(sourceval,
 | 
				
			||||||
 | 
								zfs_get_name(zh)) == 0) {
 | 
				
			||||||
 | 
								sourcetype = ZPROP_SRC_LOCAL;
 | 
				
			||||||
 | 
								(void) strncpy(list->source,
 | 
				
			||||||
 | 
									"local", sizeof (list->source));
 | 
				
			||||||
 | 
							} else if (strcmp(sourceval,
 | 
				
			||||||
 | 
								ZPROP_SOURCE_VAL_RECVD) == 0) {
 | 
				
			||||||
 | 
								sourcetype = ZPROP_SRC_RECEIVED;
 | 
				
			||||||
 | 
								(void) strncpy(list->source,
 | 
				
			||||||
 | 
									"received", sizeof (list->source));
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								sourcetype = ZPROP_SRC_INHERITED;
 | 
				
			||||||
 | 
								(void) strncpy(list->source,
 | 
				
			||||||
 | 
									sourceval, sizeof (list->source));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						(void) strncpy(list->value,
 | 
				
			||||||
 | 
									strval, sizeof (list->value));
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int clear_last_error(libzfs_handle_t *hdl) {
 | 
					int clear_last_error(libzfs_handle_t *hdl) {
 | 
				
			||||||
	zfs_standard_error(hdl, EZFS_SUCCESS, "success");
 | 
						zfs_standard_error(hdl, EZFS_SUCCESS, "success");
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										36
									
								
								zfs.go
								
								
								
								
							
							
						
						
									
										36
									
								
								zfs.go
								
								
								
								
							| 
						 | 
					@ -278,6 +278,26 @@ func (d *Dataset) GetProperty(p Prop) (prop Property, err error) {
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (d *Dataset) GetUserProperty(p string) (prop Property, err error) {
 | 
				
			||||||
 | 
						if d.list == nil {
 | 
				
			||||||
 | 
							err = errors.New(msgDatasetIsNil)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var plist *C.property_list_t
 | 
				
			||||||
 | 
						plist = C.new_property_list()
 | 
				
			||||||
 | 
						defer C.free_properties(plist)
 | 
				
			||||||
 | 
						csp := C.CString(p)
 | 
				
			||||||
 | 
						defer C.free(unsafe.Pointer(csp))
 | 
				
			||||||
 | 
						errcode := C.read_user_property(d.list.zh, plist, csp)
 | 
				
			||||||
 | 
						if errcode != 0 {
 | 
				
			||||||
 | 
							err = LastError()
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						prop = Property{Value: C.GoString(&(*plist).value[0]),
 | 
				
			||||||
 | 
							Source: C.GoString(&(*plist).source[0])}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SetProperty set ZFS dataset property to value. Not all properties can be set,
 | 
					// SetProperty set ZFS dataset property to value. Not all properties can be set,
 | 
				
			||||||
// some can be set only at creation time and some are read only.
 | 
					// some can be set only at creation time and some are read only.
 | 
				
			||||||
// Always check if returned error and its description.
 | 
					// Always check if returned error and its description.
 | 
				
			||||||
| 
						 | 
					@ -300,6 +320,22 @@ func (d *Dataset) SetProperty(p Prop, value string) (err error) {
 | 
				
			||||||
	return
 | 
						return
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (d *Dataset) SetUserProperty(prop, value string) (err error) {
 | 
				
			||||||
 | 
						if d.list == nil {
 | 
				
			||||||
 | 
							err = errors.New(msgDatasetIsNil)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						csValue := C.CString(value)
 | 
				
			||||||
 | 
						csProp := C.CString(prop)
 | 
				
			||||||
 | 
						errcode := C.zfs_prop_set(d.list.zh, csProp, csValue)
 | 
				
			||||||
 | 
						C.free(unsafe.Pointer(csValue))
 | 
				
			||||||
 | 
						C.free(unsafe.Pointer(csProp))
 | 
				
			||||||
 | 
						if errcode != 0 {
 | 
				
			||||||
 | 
							err = LastError()
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Clone - clones the dataset.  The target must be of the same type as
 | 
					// Clone - clones the dataset.  The target must be of the same type as
 | 
				
			||||||
// the source.
 | 
					// the source.
 | 
				
			||||||
func (d *Dataset) Clone(target string, props map[Prop]Property) (rd Dataset, err error) {
 | 
					func (d *Dataset) Clone(target string, props map[Prop]Property) (rd Dataset, err error) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								zfs.h
								
								
								
								
							
							
						
						
									
										1
									
								
								zfs.h
								
								
								
								
							| 
						 | 
					@ -21,6 +21,7 @@ int dataset_list_children(zfs_handle_t *zfs, dataset_list_t **first);
 | 
				
			||||||
dataset_list_t *dataset_next(dataset_list_t *dataset);
 | 
					dataset_list_t *dataset_next(dataset_list_t *dataset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int read_dataset_property(zfs_handle_t *zh, property_list_t *list, int prop);
 | 
					int read_dataset_property(zfs_handle_t *zh, property_list_t *list, int prop);
 | 
				
			||||||
 | 
					int read_user_property(zfs_handle_t *zh, property_list_t *list, const char* prop);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int clear_last_error(libzfs_handle_t *libzfs);
 | 
					int clear_last_error(libzfs_handle_t *libzfs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										17
									
								
								zfs_test.go
								
								
								
								
							
							
						
						
									
										17
									
								
								zfs_test.go
								
								
								
								
							| 
						 | 
					@ -74,7 +74,22 @@ func zfsTestDatasetOpen(t *testing.T) {
 | 
				
			||||||
		t.Error(err)
 | 
							t.Error(err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	d.Close()
 | 
						defer d.Close()
 | 
				
			||||||
 | 
						print("PASS\n\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						println("TEST Set/GetUserProperty(prop, value string) ... ")
 | 
				
			||||||
 | 
						var p zfs.Property
 | 
				
			||||||
 | 
						// Test set/get user property
 | 
				
			||||||
 | 
						if err = d.SetUserProperty("go-libzfs:test", "yes"); err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if p, err = d.GetUserProperty("go-libzfs:test"); err != nil {
 | 
				
			||||||
 | 
							t.Error(err)
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						println("go-libzfs:test", " = ",
 | 
				
			||||||
 | 
							p.Value)
 | 
				
			||||||
	print("PASS\n\n")
 | 
						print("PASS\n\n")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										4
									
								
								zpool.h
								
								
								
								
							
							
						
						
									
										4
									
								
								zpool.h
								
								
								
								
							| 
						 | 
					@ -7,6 +7,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define INT_MAX_NAME 256
 | 
					#define INT_MAX_NAME 256
 | 
				
			||||||
#define INT_MAX_VALUE 1024
 | 
					#define INT_MAX_VALUE 1024
 | 
				
			||||||
 | 
					#define	ZAP_OLDMAXVALUELEN 1024
 | 
				
			||||||
 | 
					#define	ZFS_MAX_DATASET_NAME_LEN 256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct zpool_list {
 | 
					struct zpool_list {
 | 
				
			||||||
	zpool_handle_t *zph;
 | 
						zpool_handle_t *zph;
 | 
				
			||||||
| 
						 | 
					@ -15,7 +17,7 @@ struct zpool_list {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct property_list {
 | 
					typedef struct property_list {
 | 
				
			||||||
	char value[INT_MAX_VALUE];
 | 
						char value[INT_MAX_VALUE];
 | 
				
			||||||
	char source[INT_MAX_NAME];
 | 
						char source[ZFS_MAX_DATASET_NAME_LEN];
 | 
				
			||||||
	int property;
 | 
						int property;
 | 
				
			||||||
	void *pnext;
 | 
						void *pnext;
 | 
				
			||||||
} property_list_t;
 | 
					} property_list_t;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue