Thanks!
On Sat, Sep 17, 2005 at 10:15:51AM +1000, Rusty Russell wrote:
> # HG changeset patch
> # User Rusty Russell <rusty@xxxxxxxxxxxxxxx>
> # Node ID a678d0c04c92a555cc8e592a51ed294e5cc9c021
> # Parent 90b4e122d3407c7d0e28e6391ca89d46d5a81e52
> Remove iflag argument to xs_write
> xs_write with O_CREAT|O_EXCL causes problems over daemon restarts, since it's
> not idempotent.
> It turns out noone really needs the flags word at all, so get rid of it.
> It's now as if everyone specified "O_CREAT".
>
> diff -r 90b4e122d340 -r a678d0c04c92 tools/blktap/xenbus.c
> --- a/tools/blktap/xenbus.c Fri Sep 16 05:01:11 2005
> +++ b/tools/blktap/xenbus.c Fri Sep 16 06:46:15 2005
> @@ -92,7 +92,7 @@
> if ((path == NULL) || (buf == NULL))
> return 0;
>
> - ret = xs_write(h, path, buf, strlen(buf)+1, O_CREAT);
> + ret = xs_write(h, path, buf, strlen(buf)+1);
>
> free(buf);
> free(path);
> diff -r 90b4e122d340 -r a678d0c04c92 tools/console/daemon/io.c
> --- a/tools/console/daemon/io.c Fri Sep 16 05:01:11 2005
> +++ b/tools/console/daemon/io.c Fri Sep 16 06:46:15 2005
> @@ -165,7 +165,7 @@
> success = asprintf(&path, "%s/tty", dom->conspath) != -1;
> if (!success)
> goto out;
> - success = xs_write(xs, path, slave, strlen(slave), O_CREAT);
> + success = xs_write(xs, path, slave, strlen(slave));
> free(path);
> if (!success)
> goto out;
> diff -r 90b4e122d340 -r a678d0c04c92 tools/python/xen/lowlevel/xs/xs.c
> --- a/tools/python/xen/lowlevel/xs/xs.c Fri Sep 16 05:01:11 2005
> +++ b/tools/python/xen/lowlevel/xs/xs.c Fri Sep 16 06:46:15 2005
> @@ -116,8 +116,6 @@
> "Write data to a path.\n" \
> " path [string] : xenstore path to write to\n." \
> " data [string] : data to write.\n" \
> - " create [int] : create flag, default 0.\n" \
> - " excl [int] : exclusive flag, default 0.\n" \
> "\n" \
> "Returns None on success.\n" \
> "Raises RuntimeError on error.\n" \
> @@ -125,30 +123,23 @@
>
> static PyObject *xspy_write(PyObject *self, PyObject *args, PyObject *kwds)
> {
> - static char *kwd_spec[] = { "path", "data", "create", "excl", NULL };
> - static char *arg_spec = "ss#|ii";
> + static char *kwd_spec[] = { "path", "data", NULL };
> + static char *arg_spec = "ss#";
> char *path = NULL;
> char *data = NULL;
> int data_n = 0;
> - int create = 0;
> - int excl = 0;
> -
> - struct xs_handle *xh = xshandle(self);
> - PyObject *val = NULL;
> - int flags = 0;
> +
> + struct xs_handle *xh = xshandle(self);
> + PyObject *val = NULL;
> int xsval = 0;
>
> if (!xh)
> goto exit;
> if (!PyArg_ParseTupleAndKeywords(args, kwds, arg_spec, kwd_spec,
> - &path, &data, &data_n, &create, &excl))
> - goto exit;
> - if (create)
> - flags |= O_CREAT;
> - if (excl)
> - flags |= O_EXCL;
> - Py_BEGIN_ALLOW_THREADS
> - xsval = xs_write(xh, path, data, data_n, flags);
> + &path, &data, &data_n))
> + goto exit;
> + Py_BEGIN_ALLOW_THREADS
> + xsval = xs_write(xh, path, data, data_n);
> Py_END_ALLOW_THREADS
> if (!xsval) {
> PyErr_SetFromErrno(PyExc_RuntimeError);
> diff -r 90b4e122d340 -r a678d0c04c92 tools/python/xen/xend/xenstore/xsnode.py
> --- a/tools/python/xen/xend/xenstore/xsnode.py Fri Sep 16 05:01:11 2005
> +++ b/tools/python/xen/xend/xenstore/xsnode.py Fri Sep 16 06:46:15 2005
> @@ -255,7 +255,7 @@
> if x == "": continue
> p = os.path.join(p, x)
> if not self.exists(p):
> - self.getxs().write(p, "", create=True)
> + self.getxs().write(p, "")
>
> def read(self, path):
> try:
> @@ -266,13 +266,12 @@
> else:
> raise
>
> - def create(self, path, excl=False):
> - self.write(path, "", create=True, excl=excl)
> -
> - def write(self, path, data, create=True, excl=False):
> - self.mkdirs(path)
> - try:
> - self.getxs().write(path, data, create=create, excl=excl)
> + def create(self, path):
> + self.write(path, "")
> +
> + def write(self, path, data):
> + try:
> + self.getxs().write(path, data)
> except Exception, ex:
> raise
>
> diff -r 90b4e122d340 -r a678d0c04c92
> tools/python/xen/xend/xenstore/xstransact.py
> --- a/tools/python/xen/xend/xenstore/xstransact.py Fri Sep 16 05:01:11 2005
> +++ b/tools/python/xen/xend/xenstore/xstransact.py Fri Sep 16 06:46:15 2005
> @@ -53,13 +53,11 @@
> ret.append(self._read(key))
> return ret
>
> - def _write(self, key, data, create=True, excl=False):
> - path = "%s/%s" % (self.path, key)
> - xshandle().write(path, data, create=create, excl=excl)
> + def _write(self, key, data):
> + path = "%s/%s" % (self.path, key)
> + xshandle().write(path, data)
>
> def write(self, *args, **opts):
> - create = opts.get('create') or True
> - excl = opts.get('excl') or False
> if len(args) == 0:
> raise TypeError
> if isinstance(args[0], dict):
> @@ -67,15 +65,15 @@
> if not isinstance(d, dict):
> raise TypeError
> for key in d.keys():
> - self._write(key, d[key], create, excl)
> + self._write(key, d[key])
> elif isinstance(args[0], list):
> for l in args:
> if not len(l) == 2:
> raise TypeError
> - self._write(l[0], l[1], create, excl)
> + self._write(l[0], l[1])
> elif len(args) % 2 == 0:
> for i in range(len(args) / 2):
> - self._write(args[i * 2], args[i * 2 + 1], create, excl)
> + self._write(args[i * 2], args[i * 2 + 1])
> else:
> raise TypeError
>
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/testsuite/01simple.test
> --- a/tools/xenstore/testsuite/01simple.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/01simple.test Fri Sep 16 06:46:15 2005
> @@ -1,4 +1,4 @@
> # Create an entry, read it.
> -write /test create contents
> +write /test contents
> expect contents
> read /test
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/testsuite/02directory.test
> --- a/tools/xenstore/testsuite/02directory.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/02directory.test Fri Sep 16 06:46:15 2005
> @@ -3,7 +3,7 @@
> dir /
>
> # Create a file.
> -write /test create contents
> +write /test contents
>
> # Directory shows it.
> expect test
> @@ -21,7 +21,7 @@
> dir /dir
>
> # Create a file, check it exists.
> -write /dir/test2 create contents2
> +write /dir/test2 contents2
> expect test2
> dir /dir
> expect contents2
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/testsuite/03write.test
> --- a/tools/xenstore/testsuite/03write.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/03write.test Fri Sep 16 06:46:15 2005
> @@ -1,31 +1,20 @@
> -# Write without create fails.
> -expect write failed: No such file or directory
> -write /test none contents
> -
> -# Exclusive write succeeds
> -write /test excl contents
> +# Write succeeds
> +write /test contents
> expect contents
> read /test
>
> -# Exclusive write fails to overwrite.
> -expect write failed: File exists
> -write /test excl contents
> -
> -# Non-exclusive overwrite succeeds.
> -write /test none contents2
> +# Overwrite succeeds.
> +write /test contents2
> expect contents2
> -read /test
> -write /test create contents3
> -expect contents3
> read /test
>
> # Write should implicitly create directories
> -write /dir/test create contents
> +write /dir/test contents
> expect test
> dir /dir
> expect contents
> read /dir/test
> -write /dir/1/2/3/4 excl contents4
> +write /dir/1/2/3/4 contents4
> expect test
> expect 1
> dir /dir
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/testsuite/04rm.test
> --- a/tools/xenstore/testsuite/04rm.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/04rm.test Fri Sep 16 06:46:15 2005
> @@ -4,7 +4,7 @@
> rm /dir/test
>
> # Create file and remove it
> -write /test excl contents
> +write /test contents
> rm /test
>
> # Create directory and remove it.
> @@ -13,5 +13,5 @@
>
> # Create directory, create file, remove all.
> mkdir /dir
> -write /dir/test excl contents
> +write /dir/test contents
> rm /dir
> diff -r 90b4e122d340 -r a678d0c04c92
> tools/xenstore/testsuite/05filepermissions.test
> --- a/tools/xenstore/testsuite/05filepermissions.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/05filepermissions.test Fri Sep 16 06:46:15 2005
> @@ -5,7 +5,7 @@
> getperm /dir/test
>
> # Create file: inherits from root (0 READ)
> -write /test excl contents
> +write /test contents
> expect 0 READ
> getperm /test
> setid 1
> @@ -14,7 +14,7 @@
> expect contents
> read /test
> expect write failed: Permission denied
> -write /test none contents
> +write /test contents
>
> # Take away read access to file.
> setid 0
> @@ -25,7 +25,7 @@
> expect read failed: Permission denied
> read /test
> expect write failed: Permission denied
> -write /test none contents
> +write /test contents
>
> # Grant everyone write access to file.
> setid 0
> @@ -35,7 +35,7 @@
> getperm /test
> expect read failed: Permission denied
> read /test
> -write /test none contents2
> +write /test contents2
> setid 0
> expect contents2
> read /test
> @@ -47,7 +47,7 @@
> getperm /test
> expect contents2
> read /test
> -write /test none contents3
> +write /test contents3
> expect contents3
> read /test
>
> @@ -59,7 +59,7 @@
> getperm /test
> expect contents3
> read /test
> -write /test none contents4
> +write /test contents4
>
> # User 2 can do nothing.
> setid 2
> @@ -70,7 +70,7 @@
> expect read failed: Permission denied
> read /test
> expect write failed: Permission denied
> -write /test none contents4
> +write /test contents4
>
> # Tools can always access things.
> setid 0
> @@ -78,4 +78,4 @@
> getperm /test
> expect contents4
> read /test
> -write /test none contents5
> +write /test contents5
> diff -r 90b4e122d340 -r a678d0c04c92
> tools/xenstore/testsuite/06dirpermissions.test
> --- a/tools/xenstore/testsuite/06dirpermissions.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/06dirpermissions.test Fri Sep 16 06:46:15 2005
> @@ -11,7 +11,7 @@
> getperm /dir
> dir /dir
> expect write failed: Permission denied
> -write /dir/test create contents2
> +write /dir/test contents2
>
> # Remove everyone's read access to directoy.
> setid 0
> @@ -22,7 +22,7 @@
> expect read failed: Permission denied
> read /dir/test create contents2
> expect write failed: Permission denied
> -write /dir/test create contents2
> +write /dir/test contents2
>
> # Grant everyone write access to directory.
> setid 0
> @@ -32,7 +32,7 @@
> getperm /dir
> expect dir failed: Permission denied
> dir /dir
> -write /dir/test create contents
> +write /dir/test contents
> setid 0
> expect 1 WRITE
> getperm /dir/test
> @@ -47,7 +47,7 @@
> getperm /dir
> expect test
> dir /dir
> -write /dir/test2 create contents
> +write /dir/test2 contents
> expect contents
> read /dir/test2
> setperm /dir/test2 1 NONE
> @@ -60,7 +60,7 @@
> expect test
> expect test2
> dir /dir
> -write /dir/test3 create contents
> +write /dir/test3 contents
>
> # User 2 can do nothing. Can't even tell if file exists.
> setid 2
> @@ -79,17 +79,9 @@
> expect read failed: Permission denied
> read /dir/test4
> expect write failed: Permission denied
> -write /dir/test none contents
> +write /dir/test contents
> expect write failed: Permission denied
> -write /dir/test create contents
> -expect write failed: Permission denied
> -write /dir/test excl contents
> -expect write failed: Permission denied
> -write /dir/test4 none contents
> -expect write failed: Permission denied
> -write /dir/test4 create contents
> -expect write failed: Permission denied
> -write /dir/test4 excl contents
> +write /dir/test4 contents
>
> # Tools can always access things.
> setid 0
> @@ -99,13 +91,13 @@
> expect test2
> expect test3
> dir /dir
> -write /dir/test4 create contents
> +write /dir/test4 contents
>
> # Inherited by child.
> mkdir /dir/subdir
> expect 1 NONE
> getperm /dir/subdir
> -write /dir/subfile excl contents
> +write /dir/subfile contents
> expect 1 NONE
> getperm /dir/subfile
>
> @@ -114,12 +106,12 @@
> expect 2 READ/WRITE
> getperm /dir/subdir
> setid 3
> -write /dir/subdir/subfile excl contents
> +write /dir/subdir/subfile contents
> expect 3 READ/WRITE
> getperm /dir/subdir/subfile
>
> # Inheritence works through multiple directories, too.
> -write /dir/subdir/1/2/3/4 excl contents
> +write /dir/subdir/1/2/3/4 contents
> expect 3 READ/WRITE
> getperm /dir/subdir/1/2/3/4
> mkdir /dir/subdir/a/b/c/d
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/testsuite/07watch.test
> --- a/tools/xenstore/testsuite/07watch.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/07watch.test Fri Sep 16 06:46:15 2005
> @@ -1,8 +1,8 @@
> # Watch something, write to it, check watch has fired.
> -write /test create contents
> +write /test contents
>
> 1 watch /test token
> -2 write /test create contents2
> +2 write /test contents2
> expect 1:/test:token
> 1 waitwatch
> 1 ackwatch token
> @@ -44,7 +44,7 @@
>
> # ignore watches while doing commands, should work.
> watch /dir token
> -1 write /dir/test create contents
> +1 write /dir/test contents
> expect contents
> read /dir/test
> expect /dir/test:token
> @@ -56,7 +56,7 @@
> 1 watch /dir token1
> 3 watch /dir token3
> 2 watch /dir token2
> -write /dir/test create contents
> +write /dir/test contents
> expect 3:/dir/test:token3
> 3 waitwatch
> 3 ackwatch token3
> @@ -73,7 +73,7 @@
> # If one dies (without acking), the other should still get ack.
> 1 watch /dir token1
> 2 watch /dir token2
> -write /dir/test create contents
> +write /dir/test contents
> expect 2:/dir/test:token2
> 2 waitwatch
> 2 close
> @@ -85,7 +85,7 @@
> # If one dies (without reading at all), the other should still get ack.
> 1 watch /dir token1
> 2 watch /dir token2
> -write /dir/test create contents
> +write /dir/test contents
> 2 close
> expect 1:/dir/test:token1
> 1 waitwatch
> @@ -97,7 +97,7 @@
> 1 watch /dir token1
> 1 unwatch /dir token1
> 1 watch /dir token2
> -2 write /dir/test2 create contents
> +2 write /dir/test2 contents
> expect 1:/dir/test2:token2
> 1 waitwatch
> 1 unwatch /dir token2
> @@ -107,7 +107,7 @@
> # unwatch while watch pending. Other watcher still gets the event.
> 1 watch /dir token1
> 2 watch /dir token2
> -write /dir/test create contents
> +write /dir/test contents
> 2 unwatch /dir token2
> expect 1:/dir/test:token1
> 1 waitwatch
> @@ -117,17 +117,17 @@
>
> # unwatch while watch pending. Should clear this so we get next event.
> 1 watch /dir token1
> -write /dir/test create contents
> +write /dir/test contents
> 1 unwatch /dir token1
> 1 watch /dir/test token2
> -write /dir/test none contents2
> +write /dir/test contents2
> expect 1:/dir/test:token2
> 1 waitwatch
> 1 ackwatch token2
>
> # check we only get notified once.
> 1 watch /test token
> -2 write /test create contents2
> +2 write /test contents2
> expect 1:/test:token
> 1 waitwatch
> 1 ackwatch token
> @@ -137,9 +137,9 @@
>
> # watches are queued in order.
> 1 watch / token
> -2 write /test1 create contents
> -2 write /test2 create contents
> -2 write /test3 create contents
> +2 write /test1 contents
> +2 write /test2 contents
> +2 write /test3 contents
> expect 1:/test1:token
> 1 waitwatch
> 1 ackwatch token
> @@ -153,8 +153,8 @@
>
> # Creation of subpaths should be covered correctly.
> 1 watch / token
> -2 write /test/subnode create contents2
> -2 write /test/subnode/subnode create contents2
> +2 write /test/subnode contents2
> +2 write /test/subnode/subnode contents2
> expect 1:/test/subnode:token
> 1 waitwatch
> 1 ackwatch token
> @@ -167,7 +167,7 @@
>
> # Watch event must have happened before we registered interest.
> 1 watch / token
> -2 write /test/subnode create contents2
> +2 write /test/subnode contents2
> 1 watch / token2 0
> expect 1:/test/subnode:token
> 1 waitwatch
> @@ -185,7 +185,7 @@
>
> # Watch should not double-send after we ack, even if we did something in
> between.
> 1 watch /test2 token
> -2 write /test2/foo create contents2
> +2 write /test2/foo contents2
> expect 1:/test2/foo:token
> 1 waitwatch
> expect 1:contents2
> diff -r 90b4e122d340 -r a678d0c04c92
> tools/xenstore/testsuite/08transaction.slowtest
> --- a/tools/xenstore/testsuite/08transaction.slowtest Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/08transaction.slowtest Fri Sep 16 06:46:15 2005
> @@ -1,7 +1,7 @@
> # Test transaction timeouts. Take a second each.
>
> mkdir /test
> -write /test/entry1 create contents
> +write /test/entry1 contents
>
> # Transactions can take as long as the want...
> start /test
> diff -r 90b4e122d340 -r a678d0c04c92
> tools/xenstore/testsuite/08transaction.test
> --- a/tools/xenstore/testsuite/08transaction.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/08transaction.test Fri Sep 16 06:46:15 2005
> @@ -4,7 +4,7 @@
>
> # Simple transaction: create a file inside transaction.
> 1 start /test
> -1 write /test/entry1 create contents
> +1 write /test/entry1 contents
> 2 dir /test
> expect 1:entry1
> 1 dir /test
> @@ -16,14 +16,14 @@
>
> # Create a file and abort transaction.
> 1 start /test
> -1 write /test/entry1 create contents
> +1 write /test/entry1 contents
> 2 dir /test
> expect 1:entry1
> 1 dir /test
> 1 abort
> 2 dir /test
>
> -write /test/entry1 create contents
> +write /test/entry1 contents
> # Delete in transaction, commit
> 1 start /test
> 1 rm /test/entry1
> @@ -34,7 +34,7 @@
> 2 dir /test
>
> # Delete in transaction, abort.
> -write /test/entry1 create contents
> +write /test/entry1 contents
> 1 start /test
> 1 rm /test/entry1
> expect 2:entry1
> @@ -84,8 +84,8 @@
> # Multiple events from single transaction don't trigger assert
> 1 watch /test token
> 2 start /test
> -2 write /test/1 create contents
> -2 write /test/2 create contents
> +2 write /test/1 contents
> +2 write /test/2 contents
> 2 commit
> expect 1:/test/1:token
> 1 waitwatch
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/testsuite/09domain.test
> --- a/tools/xenstore/testsuite/09domain.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/09domain.test Fri Sep 16 06:46:15 2005
> @@ -3,7 +3,7 @@
> # Create a domain, write an entry.
> expect handle is 1
> introduce 1 100 7 /my/home
> -1 write /entry1 create contents
> +1 write /entry1 contents
> expect entry1
> expect tool
> dir /
> diff -r 90b4e122d340 -r a678d0c04c92
> tools/xenstore/testsuite/10domain-homedir.test
> --- a/tools/xenstore/testsuite/10domain-homedir.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/10domain-homedir.test Fri Sep 16 06:46:15 2005
> @@ -4,7 +4,7 @@
> mkdir /home
> expect handle is 1
> introduce 1 100 7 /home
> -1 write entry1 create contents
> +1 write entry1 contents
> expect contents
> read /home/entry1
> expect entry1
> @@ -13,7 +13,7 @@
> # Place a watch using a relative path: expect relative answer.
> 1 mkdir foo
> 1 watch foo token
> -write /home/foo/bar create contents
> +write /home/foo/bar contents
> expect 1:foo/bar:token
> 1 waitwatch
> 1 ackwatch token
> diff -r 90b4e122d340 -r a678d0c04c92
> tools/xenstore/testsuite/11domain-watch.test
> --- a/tools/xenstore/testsuite/11domain-watch.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/11domain-watch.test Fri Sep 16 06:46:15 2005
> @@ -1,13 +1,13 @@
> # Test watching from a domain.
>
> # Watch something, write to it, check watch has fired.
> -write /test create contents
> +write /test contents
> mkdir /dir
>
> expect handle is 1
> introduce 1 100 7 /my/home
> 1 watch /test token
> -write /test create contents2
> +write /test contents2
> expect 1:/test:token
> 1 waitwatch
> 1 ackwatch token
> @@ -19,10 +19,10 @@
> expect handle is 1
> introduce 1 100 7 /my/home
> 1 watch /dir token
> -write /dir/test create contents
> -1 write /dir/test2 create contents2
> -1 write /dir/test3 create contents3
> -1 write /dir/test4 create contents4
> +write /dir/test contents
> +1 write /dir/test2 contents2
> +1 write /dir/test3 contents3
> +1 write /dir/test4 contents4
> expect 1:/dir/test:token
> 1 waitwatch
> 1 ackwatch token
> @@ -35,7 +35,7 @@
> 1 watch /dir token1
> 1 unwatch /dir token1
> 1 watch /dir token2
> -write /dir/test2 create contents
> +write /dir/test2 contents
> expect 1:/dir/test2:token2
> 1 waitwatch
> 1 unwatch /dir token2
> @@ -46,7 +46,7 @@
> expect handle is 1
> introduce 1 100 7 /my/home
> 1 watch /dir token1
> -write /dir/test2 create contents
> +write /dir/test2 contents
> 1 unwatch /dir token1
> release 1
> 1 close
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/testsuite/12readonly.test
> --- a/tools/xenstore/testsuite/12readonly.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/12readonly.test Fri Sep 16 06:46:15 2005
> @@ -1,6 +1,6 @@
> # Test that read only connection can't alter store.
>
> -write /test create contents
> +write /test contents
>
> readonly
> expect test
> @@ -20,9 +20,9 @@
>
> # These don't work
> expect write failed: Read-only file system
> -write /test2 create contents
> +write /test2 contents
> expect write failed: Read-only file system
> -write /test create contents
> +write /test contents
> expect setperm failed: Read-only file system
> setperm /test 100 NONE
> expect setperm failed: Read-only file system
> @@ -35,7 +35,7 @@
> # Check that watches work like normal.
> watch / token
> 1 readwrite
> -1 write /test create contents
> +1 write /test contents
> expect /test:token
> waitwatch
> ackwatch token
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/testsuite/13watch-ack.test
> --- a/tools/xenstore/testsuite/13watch-ack.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/13watch-ack.test Fri Sep 16 06:46:15 2005
> @@ -13,10 +13,10 @@
> 1 watch /test/1 token1
> 1 watch /test/2 token2
> 1 watch /test/3 token3
> -2 write /test/2 create contents2
> +2 write /test/2 contents2
> expect 1:/test/2:token2
> 1 waitwatch
> -3 write /test/1 create contents1
> -4 write /test/3 create contents3
> +3 write /test/1 contents1
> +4 write /test/3 contents3
> 1 ackwatch token2
> 1 close
> diff -r 90b4e122d340 -r a678d0c04c92
> tools/xenstore/testsuite/14complexperms.test
> --- a/tools/xenstore/testsuite/14complexperms.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/14complexperms.test Fri Sep 16 06:46:15 2005
> @@ -12,13 +12,7 @@
> expect *Permission denied
> read /dir/file
> expect *Permission denied
> -write /dir/file none value
> -expect *Permission denied
> -write /dir/file create value
> -expect *Permission denied
> -write /dir/file excl value
> -expect write failed: Invalid argument
> -write /dir/file crap value
> +write /dir/file value
> expect *Permission denied
> mkdir /dir/file
> expect *Permission denied
> @@ -30,7 +24,7 @@
> expect *Permission denied
> setperm /dir/file 0 NONE
> watch /dir/file token
> -1 write /dir/file create contents
> +1 write /dir/file contents
> 1 rm /dir/file
> expect waitwatch failed: Connection timed out
> waitwatch
> @@ -50,7 +44,7 @@
>
> # Now it exists
> setid 0
> -write /dir/file create contents
> +write /dir/file contents
>
> setid 1
> expect *Permission denied
> @@ -58,13 +52,7 @@
> expect *Permission denied
> read /dir/file
> expect *Permission denied
> -write /dir/file none value
> -expect *Permission denied
> -write /dir/file create value
> -expect *Permission denied
> -write /dir/file excl value
> -expect write failed: Invalid argument
> -write /dir/file crap value
> +write /dir/file value
> expect *Permission denied
> mkdir /dir/file
> expect *Permission denied
> @@ -76,7 +64,7 @@
> expect *Permission denied
> setperm /dir/file 0 NONE
> watch /dir/file token
> -1 write /dir/file create contents
> +1 write /dir/file contents
> 1 rm /dir/file
> expect waitwatch failed: Connection timed out
> waitwatch
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/testsuite/15nowait.test
> --- a/tools/xenstore/testsuite/15nowait.test Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/testsuite/15nowait.test Fri Sep 16 06:46:15 2005
> @@ -1,10 +1,10 @@
> # If we don't wait for an ack, we can crash daemon as it never expects to be
> # sending out two replies on top of each other.
> -noackwrite /1 create 1
> -noackwrite /2 create 2
> -noackwrite /3 create 3
> -noackwrite /4 create 4
> -noackwrite /5 create 5
> +noackwrite /1 1
> +noackwrite /2 2
> +noackwrite /3 3
> +noackwrite /4 4
> +noackwrite /5 5
> readack
> readack
> readack
> @@ -13,11 +13,11 @@
>
> expect handle is 1
> introduce 1 100 7 /my/home
> -1 noackwrite /1 create 1
> -1 noackwrite /2 create 2
> -1 noackwrite /3 create 3
> -1 noackwrite /4 create 4
> -1 noackwrite /5 create 5
> +1 noackwrite /1 1
> +1 noackwrite /2 2
> +1 noackwrite /3 3
> +1 noackwrite /4 4
> +1 noackwrite /5 5
> 1 readack
> 1 readack
> 1 readack
> diff -r 90b4e122d340 -r a678d0c04c92
> tools/xenstore/testsuite/16block-watch-crash.test
> --- a/tools/xenstore/testsuite/16block-watch-crash.test Fri Sep 16
> 05:01:11 2005
> +++ b/tools/xenstore/testsuite/16block-watch-crash.test Fri Sep 16
> 06:46:15 2005
> @@ -4,8 +4,8 @@
> watch /test token
> 1 start /test
> # This will block on above
> -noackwrite /test/entry create contents
> -1 write /test/entry2 create contents
> +noackwrite /test/entry contents
> +1 write /test/entry2 contents
> 1 commit
> readack
> expect /test/entry2:token
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/xenstored_core.c
> --- a/tools/xenstore/xenstored_core.c Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/xenstored_core.c Fri Sep 16 06:46:15 2005
> @@ -968,14 +968,12 @@
> return lstat(node_dir(conn->transaction, node), &st) == 0;
> }
>
> -/* path, flags, data... */
> +/* path, data... */
> static void do_write(struct connection *conn, struct buffered_data *in)
> {
> unsigned int offset, datalen;
> - char *vec[2];
> + char *vec[1] = { NULL }; /* gcc4 + -W + -Werror fucks code. */
> char *node, *tmppath;
> - enum xs_perm_type mode;
> - struct stat st;
>
> /* Extra "strings" can be created by binary data. */
> if (get_strings(in, vec, ARRAY_SIZE(vec)) < ARRAY_SIZE(vec)) {
> @@ -992,37 +990,20 @@
> if (transaction_block(conn, node))
> return;
>
> - offset = strlen(vec[0]) + strlen(vec[1]) + 2;
> + offset = strlen(vec[0]) + 1;
> datalen = in->used - offset;
>
> - if (streq(vec[1], XS_WRITE_NONE))
> - mode = XS_PERM_WRITE;
> - else if (streq(vec[1], XS_WRITE_CREATE))
> - mode = XS_PERM_WRITE|XS_PERM_ENOENT_OK;
> - else if (streq(vec[1], XS_WRITE_CREATE_EXCL))
> - mode = XS_PERM_WRITE|XS_PERM_ENOENT_OK;
> - else {
> - send_error(conn, EINVAL);
> - return;
> - }
> -
> - if (!check_node_perms(conn, node, mode)) {
> + if (!check_node_perms(conn, node, XS_PERM_WRITE|XS_PERM_ENOENT_OK)) {
> send_error(conn, errno);
> return;
> }
>
> - if (lstat(node_dir(conn->transaction, node), &st) != 0) {
> + if (!node_exists(conn, node)) {
> char *dir;
>
> /* Does not exist... */
> if (errno != ENOENT) {
> send_error(conn, errno);
> - return;
> - }
> -
> - /* Not going to create it? */
> - if (streq(vec[1], XS_WRITE_NONE)) {
> - send_error(conn, ENOENT);
> return;
> }
>
> @@ -1034,11 +1015,6 @@
>
> } else {
> /* Exists... */
> - if (streq(vec[1], XS_WRITE_CREATE_EXCL)) {
> - send_error(conn, EEXIST);
> - return;
> - }
> -
> tmppath = tempfile(node_datafile(conn->transaction, node),
> in->buffer + offset, datalen);
> if (!tmppath) {
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/xs.c
> --- a/tools/xenstore/xs.c Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/xs.c Fri Sep 16 06:46:15 2005
> @@ -326,32 +326,17 @@
> }
>
> /* Write the value of a single file.
> - * Returns false on failure. createflags can be 0, O_CREAT, or
> O_CREAT|O_EXCL.
> + * Returns false on failure.
> */
> bool xs_write(struct xs_handle *h, const char *path,
> - const void *data, unsigned int len, int createflags)
> -{
> - const char *flags;
> - struct iovec iovec[3];
> -
> - /* Format: Flags (as string), path, data. */
> - if (createflags == 0)
> - flags = XS_WRITE_NONE;
> - else if (createflags == O_CREAT)
> - flags = XS_WRITE_CREATE;
> - else if (createflags == (O_CREAT|O_EXCL))
> - flags = XS_WRITE_CREATE_EXCL;
> - else {
> - errno = EINVAL;
> - return false;
> - }
> + const void *data, unsigned int len)
> +{
> + struct iovec iovec[2];
>
> iovec[0].iov_base = (void *)path;
> iovec[0].iov_len = strlen(path) + 1;
> - iovec[1].iov_base = (void *)flags;
> - iovec[1].iov_len = strlen(flags) + 1;
> - iovec[2].iov_base = (void *)data;
> - iovec[2].iov_len = len;
> + iovec[1].iov_base = (void *)data;
> + iovec[1].iov_len = len;
>
> return xs_bool(xs_talkv(h, XS_WRITE, iovec, ARRAY_SIZE(iovec), NULL));
> }
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/xs.h
> --- a/tools/xenstore/xs.h Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/xs.h Fri Sep 16 06:46:15 2005
> @@ -53,10 +53,10 @@
> void *xs_read(struct xs_handle *h, const char *path, unsigned int *len);
>
> /* Write the value of a single file.
> - * Returns false on failure. createflags can be 0, O_CREAT, or
> O_CREAT|O_EXCL.
> + * Returns false on failure.
> */
> bool xs_write(struct xs_handle *h, const char *path, const void *data,
> - unsigned int len, int createflags);
> + unsigned int len);
>
> /* Create a new directory.
> * Returns false on failure, or success if it already exists.
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/xs_crashme.c
> --- a/tools/xenstore/xs_crashme.c Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/xs_crashme.c Fri Sep 16 06:46:15 2005
> @@ -267,17 +267,12 @@
> free(xs_read(h, name, &num));
> break;
> case 2: {
> - int flags = random_flags(&state);
> char *contents = talloc_asprintf(NULL, "%i",
> get_randomness(&state));
> unsigned int len = get_randomness(&state)%(strlen(contents)+1);
> if (verbose)
> - printf("WRITE %s %s %.*s\n", name,
> - flags == O_CREAT ? "O_CREAT"
> - : flags == (O_CREAT|O_EXCL) ? "O_CREAT|O_EXCL"
> - : flags == 0 ? "0" : "CRAPFLAGS",
> - len, contents);
> - xs_write(h, name, contents, len, flags);
> + printf("WRITE %s %.*s\n", name, len, contents);
> + xs_write(h, name, contents, len);
> break;
> }
> case 3:
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/xs_random.c
> --- a/tools/xenstore/xs_random.c Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/xs_random.c Fri Sep 16 06:46:15 2005
> @@ -26,7 +26,7 @@
> void *(*read)(void *h, const char *path, unsigned int *len);
>
> bool (*write)(void *h, const char *path, const void *data,
> - unsigned int len, int createflags);
> + unsigned int len);
>
> bool (*mkdir)(void *h, const char *path);
>
> @@ -333,40 +333,18 @@
>
> static bool file_write(struct file_ops_info *info,
> const char *path, const void *data,
> - unsigned int len, int createflags)
> + unsigned int len)
> {
> char *filename = filename_to_data(path_to_name(info, path));
> int fd;
>
> - /* Kernel isn't strict, but library is. */
> - if (createflags & ~(O_CREAT|O_EXCL)) {
> - errno = EINVAL;
> - return false;
> - }
> -
> if (!write_ok(info, path))
> return false;
>
> - /* We regard it as existing if dir exists. */
> - if (strends(filename, ".DATA")) {
> - if (!createflags)
> - createflags = O_CREAT;
> - if (createflags & O_EXCL) {
> - errno = EEXIST;
> - return false;
> - }
> - }
> -
> - if (createflags & O_CREAT)
> - make_dirs(parent_filename(filename));
> -
> - fd = open(filename, createflags|O_TRUNC|O_WRONLY, 0600);
> - if (fd < 0) {
> - /* FIXME: Another hack. */
> - if (!(createflags & O_CREAT) && errno == EISDIR)
> - errno = EEXIST;
> + make_dirs(parent_filename(filename));
> + fd = open(filename, O_CREAT|O_TRUNC|O_WRONLY, 0600);
> + if (fd < 0)
> return false;
> - }
>
> if (write(fd, data, len) != (int)len)
> barf_perror("Bad write to %s", filename);
> @@ -846,20 +824,6 @@
> return ret;
> }
>
> -static int random_flags(int *state)
> -{
> - switch (get_randomness(state) % 4) {
> - case 0:
> - return 0;
> - case 1:
> - return O_CREAT;
> - case 2:
> - return O_CREAT|O_EXCL;
> - default:
> - return get_randomness(state);
> - }
> -}
> -
> /* Do the next operation, return the results. */
> static char *do_next_op(struct ops *ops, void *h, int state, bool verbose)
> {
> @@ -883,18 +847,12 @@
> ret = linearize_read(ops->read(h, name, &num), &num);
> break;
> case 2: {
> - int flags = random_flags(&state);
> char *contents = talloc_asprintf(NULL, "%i",
> get_randomness(&state));
> unsigned int len = get_randomness(&state)%(strlen(contents)+1);
> if (verbose)
> - printf("WRITE %s %s %.*s\n", name,
> - flags == O_CREAT ? "O_CREAT"
> - : flags == (O_CREAT|O_EXCL) ? "O_CREAT|O_EXCL"
> - : flags == 0 ? "0" : "CRAPFLAGS",
> - len, contents);
> - ret = bool_to_errstring(ops->write(h, name, contents, len,
> - flags));
> + printf("WRITE %s %.*s\n", name, len, contents);
> + ret = bool_to_errstring(ops->write(h, name, contents, len));
> talloc_steal(ret, contents);
> break;
> }
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/xs_stress.c
> --- a/tools/xenstore/xs_stress.c Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/xs_stress.c Fri Sep 16 06:46:15 2005
> @@ -61,7 +61,7 @@
> barf_perror("%i: can't read %s iter %i",
> childnum, file, i);
> sprintf(tmp, "%i", atoi(contents) + 1);
> - if (!xs_write(h, file, tmp, strlen(tmp)+1, 0))
> + if (!xs_write(h, file, tmp, strlen(tmp)+1))
> barf_perror("%i: can't write %s iter %i",
> childnum, file, i);
>
> @@ -91,7 +91,7 @@
>
> if (togo == 0) {
> sprintf(filename, "%s/count", base);
> - if (!xs_write(h, filename, "0", 2, O_EXCL|O_CREAT))
> + if (!xs_write(h, filename, "0", 1))
> barf_perror("Writing to %s", filename);
> return;
> }
> diff -r 90b4e122d340 -r a678d0c04c92 tools/xenstore/xs_test.c
> --- a/tools/xenstore/xs_test.c Fri Sep 16 05:01:11 2005
> +++ b/tools/xenstore/xs_test.c Fri Sep 16 06:46:15 2005
> @@ -192,7 +192,7 @@
> "Reads commands from stdin, one per line:"
> " dir <path>\n"
> " read <path>\n"
> - " write <path> <flags> <value>...\n"
> + " write <path> <value>...\n"
> " setid <id>\n"
> " mkdir <path>\n"
> " rm <path>\n"
> @@ -213,7 +213,7 @@
> " notimeout\n"
> " readonly\n"
> " readwrite\n"
> - " noackwrite <path> <flags> <value>...\n"
> + " noackwrite <path> <value>...\n"
> " readack\n"
> " dump\n");
> }
> @@ -348,47 +348,22 @@
> output("%.*s\n", len, value);
> }
>
> -static void do_write(unsigned int handle, char *path, char *flags, char
> *data)
> -{
> - int f;
> -
> - if (streq(flags, "none"))
> - f = 0;
> - else if (streq(flags, "create"))
> - f = O_CREAT;
> - else if (streq(flags, "excl"))
> - f = O_CREAT | O_EXCL;
> - else if (streq(flags, "crap"))
> - f = 100;
> - else
> - barf("write flags 'none', 'create' or 'excl' only");
> -
> - if (!xs_write(handles[handle], path, data, strlen(data), f))
> +static void do_write(unsigned int handle, char *path, char *data)
> +{
> + if (!xs_write(handles[handle], path, data, strlen(data)))
> failed(handle);
> }
>
> static void do_noackwrite(unsigned int handle,
> - char *path, const char *flags, char *data)
> + char *path, char *data)
> {
> struct xsd_sockmsg msg;
>
> - /* Format: Flags (as string), path, data. */
> - if (streq(flags, "none"))
> - flags = XS_WRITE_NONE;
> - else if (streq(flags, "create"))
> - flags = XS_WRITE_CREATE;
> - else if (streq(flags, "excl"))
> - flags = XS_WRITE_CREATE_EXCL;
> - else
> - barf("noackwrite flags 'none', 'create' or 'excl' only");
> -
> - msg.len = strlen(path) + 1 + strlen(flags) + 1 + strlen(data);
> + msg.len = strlen(path) + 1 + strlen(data);
> msg.type = XS_WRITE;
> if (!write_all_choice(handles[handle]->fd, &msg, sizeof(msg)))
> failed(handle);
> if (!write_all_choice(handles[handle]->fd, path, strlen(path) + 1))
> - failed(handle);
> - if (!write_all_choice(handles[handle]->fd, flags, strlen(flags) + 1))
> failed(handle);
> if (!write_all_choice(handles[handle]->fd, data, strlen(data)))
> failed(handle);
> @@ -778,8 +753,7 @@
> else if (streq(command, "read"))
> do_read(handle, arg(line, 1));
> else if (streq(command, "write"))
> - do_write(handle,
> - arg(line, 1), arg(line, 2), arg(line, 3));
> + do_write(handle, arg(line, 1), arg(line, 2));
> else if (streq(command, "setid"))
> do_setid(handle, arg(line, 1));
> else if (streq(command, "mkdir"))
> @@ -832,7 +806,7 @@
> xs_daemon_close(handles[handle]);
> handles[handle] = NULL;
> } else if (streq(command, "noackwrite"))
> - do_noackwrite(handle, arg(line,1), arg(line,2), arg(line,3));
> + do_noackwrite(handle, arg(line,1), arg(line,2));
> else if (streq(command, "readack"))
> do_readack(handle);
> else
>
> --
> A bad analogy is like a leaky screwdriver -- Richard Braakman
>
>
_______________________________________________
Xen-tools mailing list
Xen-tools@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-tools
|