Thanks!The revised path! ---------------------------------------------------------------------------------------------------------- diff -Nuar /udev/libsysfs/libsysfs.h /root/udev-0.2/libsysfs/libsysfs.h --- /udev/libsysfs/libsysfs.h 2003-07-19 03:06:48.000000000 +0800 +++ /root/udev-0.2/libsysfs/libsysfs.h 2003-08-12 16:05:36.483706096 +0800 @@ -124,6 +124,9 @@ extern int sysfs_read_attribute(struct sysfs_attribute *sysattr); extern int sysfs_read_attribute_value(const char *attrpath, char *value, size_t vsize); +extern int sysfs_write_attribute(struct sysfs_attribute *sysattr); +extern int sysfs_write_attribute_value(const char *attrpath, char *value); + extern char *sysfs_get_value_from_attributes(struct sysfs_attribute *attr, const char * name); extern void sysfs_close_directory(struct sysfs_directory *sysdir); diff -Nuar /udev/libsysfs/sysfs_dir.c /root/udev-0.2/libsysfs/sysfs_dir.c --- /udev/libsysfs/sysfs_dir.c 2003-07-19 03:06:34.000000000 +0800 +++ /root/udev-0.2/libsysfs/sysfs_dir.c 2003-08-12 16:07:45.000168624 +0800 @@ -78,6 +78,43 @@ return sysattr; } +/** + * sysfs_write_attribute: write value to the attribute + * @sysattr: attribute to write + * returns 0 with success and -1 with error. + */ +int sysfs_write_attribute(struct sysfs_attribute *sysattr) +{ + int fd; + int length; + + if (sysattr == NULL) { + errno = EINVAL; + return -1; + } + + if (!(sysattr->method & SYSFS_METHOD_STORE)) { + dprintf (stderr, "Store method not supported for attribute %s\n", + sysattr->path); + return -1; + } + + if ((fd = open(sysattr->path, O_RDWR)) < 0) { + dprintf (stderr, "Error reading attribute %s\n", sysattr->path); + return -1; + } + + length = write(fd,sysattr->value,sizeof(sysattr->value)); + if (length < 0) { + dprintf (stderr, "Error write to the attribute %s\n", + sysattr->path); + close(fd); + return -1; + } + close(fd); + return 0; +} + /** * sysfs_read_attribute: reads value from attribute @@ -134,6 +171,41 @@ } /** + * sysfs_write_attribute_value: given path to attribute, + * value will be saved to the attribute. + * @attrpath: sysfs path to attribute + * @value: value to give to attribute + * returns 0 with success and -1 with error. + */ +int sysfs_write_attribute_value(const char *attrpath, char *value) +{ + struct sysfs_attribute *attr = NULL; + + if (attrpath == NULL || value == NULL) { + errno = EINVAL; + return -1; + } + + attr = sysfs_open_attribute(attrpath); + if (attr == NULL) { + dprintf(stderr, "Invalid attribute path %s\n", attrpath); + errno = EINVAL; + return -1; + } + strncpy(attr->value,value,sizeof(value)); + if((sysfs_write_attribute(attr) != 0 )){ + dprintf(stderr, "Error write to attribute %s\n", attrpath); + sysfs_close_attribute(attr); + return -1; + } + + sysfs_close_attribute(attr); + + return 0; +} + + +/** * sysfs_read_attribute_value: given path to attribute, return its value. * values can be up to a pagesize, if buffer is smaller the value will * be truncated. -----Original Message----- From: Daniel Stekloff [mailto:dsteklof@us.ibm.com] Sent: Tuesday, August 05, 2003 6:09 PM To: Guo, Min Cc: linux-hotplug-devel@lists.sourceforge.net; Greg KH Subject: RE: [ANNOUNCE] udev 0.2 release Hi Guo Min, Thank you very much for the patch. It's a good start. Some ideas: - sysfs_write_attribute needs to actually write the value out to the file/attribute. Use the path in sysfs_attribute. - sysfs_write_attribute should probably only need the sysfs_attribute *sysattr as an argument, the value being already assigned to the sysfs_attribute. - sysfs_write_attribute_value could assign the value to the included sysfs_attribute and then call sysfs_write_attribute like you have it now. - Please look at sysfs_read_attribute as a guide. Thanks, Dan