All of lore.kernel.org
 help / color / mirror / Atom feed
From: Saul Wold <sgw@linux.intel.com>
To: Khem Raj <raj.khem@gmail.com>
Cc: Patches and discussions about the oe-core layer
	<openembedded-core@lists.openembedded.org>
Subject: Re: [PATCH 10/20] pseudo: Wrap renameat and opendir
Date: Tue, 07 Feb 2012 08:43:57 -0800	[thread overview]
Message-ID: <4F3154CD.3000305@linux.intel.com> (raw)
In-Reply-To: <CAMKF1sqQQLVBUarw50B33DmD9G_YNrG7QpJj8-LgtygO8j3O+w@mail.gmail.com>

On 02/07/2012 08:31 AM, Khem Raj wrote:
> On Tue, Feb 7, 2012 at 8:21 AM, Saul Wold<sgw@linux.intel.com>  wrote:
>> On 02/05/2012 10:40 PM, Khem Raj wrote:
>>>
>>> Signed-off-by: Khem Raj<raj.khem@gmail.com>
>>> ---
>>>   meta/recipes-devtools/pseudo/pseudo/opendir.patch  |   92 ++++++++
>>>   meta/recipes-devtools/pseudo/pseudo/renameat.patch |  227
>>> ++++++++++++++++++++
>>>   meta/recipes-devtools/pseudo/pseudo_1.2.bb         |    6 +-
>>>   3 files changed, 323 insertions(+), 2 deletions(-)
>>>   create mode 100644 meta/recipes-devtools/pseudo/pseudo/opendir.patch
>>>   create mode 100644 meta/recipes-devtools/pseudo/pseudo/renameat.patch
>>>
>>> diff --git a/meta/recipes-devtools/pseudo/pseudo/opendir.patch
>>> b/meta/recipes-devtools/pseudo/pseudo/opendir.patch
>>> new file mode 100644
>>> index 0000000..d20f717
>>> --- /dev/null
>>> +++ b/meta/recipes-devtools/pseudo/pseudo/opendir.patch
>>> @@ -0,0 +1,92 @@
>>> +commit 162f2692c399b93311652201a940fdaf9c9e6924
>>> +Author: Peter Seebach<peter.seebach@windriver.com>
>>> +Date:   Thu Feb 2 11:45:42 2012 -0600
>>> +
>>> +    Make opendir/closedir stash and forget directory names.
>>> +
>>> +    The dirfd(DIR *) interface allows you to get the fd for a DIR *,
>>> +    meaning you can use it with openat(), meaning you can need its
>>> +    path.  This causes a segfault.  Also gonna fix the base_path
>>> +    code not to segfault in that case, but first fix the underlying
>>> +    problem.
>>> +
>>
>>
>> Missing Upstream-Status: and Signed-off-by (yes I know we have an email
>> header).
>
> they are backports
>
Please update the patch!

Thanks
	Sau!

>>
>> Thanks
>>         Sau!
>>
>>> +diff --git a/ChangeLog.txt b/ChangeLog.txt
>>> +index 4de488c..9625b38 100644
>>> +--- a/ChangeLog.txt
>>> ++++ b/ChangeLog.txt
>>> +@@ -1,3 +1,7 @@
>>> ++2012-02-02:
>>> ++      * (seebs) stash dir name for DIR * from opendir using dirfd.
>>> ++      * (seebs) add closedir.
>>> ++
>>> + 2011-11-02:
>>> +       * (seebs) Call this 1.2 because the UNLOAD change is moderately
>>> +         significant, and so's the clone change.
>>> +diff --git a/ports/unix/guts/closedir.c b/ports/unix/guts/closedir.c
>>> +new file mode 100644
>>> +index 0000000..1085361
>>> +--- /dev/null
>>> ++++ b/ports/unix/guts/closedir.c
>>> +@@ -0,0 +1,20 @@
>>> ++/*
>>> ++ * Copyright (c) 2012 Wind River Systems; see
>>> ++ * guts/COPYRIGHT for information.
>>> ++ *
>>> ++ * static int
>>> ++ * wrap_closedir(DIR *dirp) {
>>> ++ *    int rc = -1;
>>> ++ */
>>> ++      if (!dirp) {
>>> ++              errno = EFAULT;
>>> ++              return -1;
>>> ++      }
>>> ++
>>> ++      int fd = dirfd(dirp);
>>> ++      pseudo_client_op(OP_CLOSE, 0, fd, -1, 0, 0);
>>> ++      rc = real_closedir(dirp);
>>> ++
>>> ++/*    return rc;
>>> ++ * }
>>> ++ */
>>> +diff --git a/ports/unix/guts/opendir.c b/ports/unix/guts/opendir.c
>>> +index 8eaa71f..e69717e 100644
>>> +--- a/ports/unix/guts/opendir.c
>>> ++++ b/ports/unix/guts/opendir.c
>>> +@@ -6,8 +6,25 @@
>>> +  * wrap_opendir(const char *path) {
>>> +  *    DIR * rc = NULL;
>>> +  */
>>> ++      struct stat buf;
>>> ++      int save_errno;
>>> +
>>> +       rc = real_opendir(path);
>>> ++      if (rc) {
>>> ++              int fd;
>>> ++              save_errno = errno;
>>> ++              fd = dirfd(rc);
>>> ++              if (real_fstat(fd,&buf) == -1) {
>>>
>>> ++                      pseudo_debug(1, "diropen (fd %d) succeeded, but
>>> fstat failed (%s).\n",
>>> ++                              fd, strerror(errno));
>>> ++                      pseudo_client_op_plain(OP_OPEN, PSA_READ, fd, -1,
>>> path, 0);
>>> ++              } else {
>>> ++                      pseudo_client_op_plain(OP_OPEN, PSA_READ, fd, -1,
>>> path,&buf);
>>> ++              }
>>> ++
>>> ++
>>> ++              errno = save_errno;
>>> ++      }
>>> +
>>> + /*    return rc;
>>> +  * }
>>> +diff --git a/ports/unix/wrapfuncs.in b/ports/unix/wrapfuncs.in
>>> +index e06e404..32250c4 100644
>>> +--- a/ports/unix/wrapfuncs.in
>>> ++++ b/ports/unix/wrapfuncs.in
>>> +@@ -21,6 +21,7 @@ long pathconf(const char *path, int name);
>>> + char *realpath(const char *name, char *resolved_name); /*
>>> version="GLIBC_2.3" */
>>> + int remove(const char *path); /* flags=AT_SYMLINK_NOFOLLOW */
>>> + DIR *opendir(const char *path);
>>> ++int closedir(DIR *dirp);
>>> + char *tempnam(const char *template, const char *pfx);
>>> + char *tmpnam(char *s);
>>> + int truncate(const char *path, off_t length);
>>> diff --git a/meta/recipes-devtools/pseudo/pseudo/renameat.patch
>>> b/meta/recipes-devtools/pseudo/pseudo/renameat.patch
>>> new file mode 100644
>>> index 0000000..74c8585
>>> --- /dev/null
>>> +++ b/meta/recipes-devtools/pseudo/pseudo/renameat.patch
>>> @@ -0,0 +1,227 @@
>>> +commit 795f2b44b7f692151556782f142a4a6e7d45d892
>>> +Author: Peter Seebach<peter.seebach@windriver.com>
>>> +Date:   Thu Feb 2 15:49:21 2012 -0600
>>> +
>>> +    Implement renameat()
>>> +
>>> +    After three long years, someone tried to use this.  This was
>>> impossibly
>>> +    hard back when pseudo was written, because there was only one dirfd
>>> +    provided for.  Thing is, now, the canonicalization happens in
>>> wrapfuncs,
>>> +    so a small tweak to makewrappers to recognize that oldpath should use
>>> +    olddirfd if it exists is enough to get us fully canonicalized paths
>>> +    when needed.
>>> +
>>> +    Also fix the crash if base_path gets called with an fd for which we
>>> have
>>> +    no path.
>>> +
>>> +diff --git a/ChangeLog.txt b/ChangeLog.txt
>>> +index 9625b38..25bd463 100644
>>> +--- a/ChangeLog.txt
>>> ++++ b/ChangeLog.txt
>>> +@@ -1,6 +1,9 @@
>>> + 2012-02-02:
>>> +       * (seebs) stash dir name for DIR * from opendir using dirfd.
>>> +       * (seebs) add closedir.
>>> ++      * (seebs) add initial pass at renameat()
>>> ++      * (seebs) in base_path, don't try to strlen the result if
>>> ++        fd_path() returns NULL.
>>> +
>>> + 2011-11-02:
>>> +       * (seebs) Call this 1.2 because the UNLOAD change is moderately
>>> +diff --git a/makewrappers b/makewrappers
>>> +index 20bbf2b..bf344d6 100755
>>> +--- a/makewrappers
>>> ++++ b/makewrappers
>>> +@@ -211,12 +211,13 @@ class Function:
>>> +         self.flags = '0'
>>> +         self.port = port
>>> +         self.directory = ''
>>> +-      self.version = 'NULL'
>>> ++        self.version = 'NULL'
>>> +         # On Darwin, some functions are SECRETLY converted to
>>> foo$INODE64
>>> +         # when called.  So we have to look those up for real_*
>>> +         self.inode64 = None
>>> +         self.real_func = None
>>> +         self.paths_to_munge = []
>>> ++        self.dirfds = {}
>>> +         self.hand_wrapped = None
>>> +         # used for the copyright date when creating stub functions
>>> +         self.date = datetime.date.today().year
>>> +@@ -239,6 +240,7 @@ class Function:
>>> +         # * If the arg has a name ending in 'path', we will canonicalize
>>> it.
>>> +         # * If the arg is named 'dirfd' or 'flags', it becomes the
>>> default
>>> +         #   values for the dirfd and flags arguments when
>>> canonicalizing.
>>> ++        # * If the name ends in dirfd, we do the same fancy stuff.
>>> +         # * Note that the "comments" field (/* ... */ after the decl)
>>> can
>>> +         #   override the dirfd/flags values.
>>> +         self.args = ArgumentList(bits.group(2))
>>> +@@ -246,7 +248,9 @@ class Function:
>>> +             # ignore varargs, they never get these special treatments
>>> +             if arg.vararg:
>>> +                 pass
>>> +-            elif arg.name == 'dirfd':
>>> ++            elif arg.name[-5:] == 'dirfd':
>>> ++                if len(arg.name)>    5:
>>> ++                    self.dirfds[arg.name[:-5]] = True
>>> +                 self.dirfd = 'dirfd'
>>> +             elif arg.name == 'flags':
>>> +                 self.flags = 'flags'
>>> +@@ -325,9 +329,13 @@ class Function:
>>> +         """create/allocate canonical paths"""
>>> +         alloc_paths = []
>>> +         for path in self.paths_to_munge:
>>> ++            prefix = path[:-4]
>>> ++          if not prefix in self.dirfds:
>>> ++                prefix = ''
>>> ++            print "for path %s: prefix<%s>" % ( path, prefix )
>>> +             alloc_paths.append(
>>> +-                "%s = pseudo_root_path(__func__, __LINE__, %s, %s, %s);"
>>> %
>>> +-                (path, self.dirfd, path, self.flags))
>>> ++                "%s = pseudo_root_path(__func__, __LINE__, %s%s, %s,
>>> %s);" %
>>> ++                (path, prefix, self.dirfd, path, self.flags))
>>> +         return "\n\t\t\t".join(alloc_paths)
>>> +
>>> +     def free_paths(self):
>>> +diff --git a/ports/unix/guts/renameat.c b/ports/unix/guts/renameat.c
>>> +index c8203b7..f13cd1e 100644
>>> +--- a/ports/unix/guts/renameat.c
>>> ++++ b/ports/unix/guts/renameat.c
>>> +@@ -1,15 +1,111 @@
>>> + /*
>>> +- * Copyright (c) 2008-2010 Wind River Systems; see
>>> ++ * Copyright (c) 2008-2012 Wind River Systems; see
>>> +  * guts/COPYRIGHT for information.
>>> +  *
>>> +  * static int
>>> +  * wrap_renameat(int olddirfd, const char *oldpath, int newdirfd, const
>>> char *newpath) {
>>> +  *    int rc = -1;
>>> +  */
>>> ++      pseudo_msg_t *msg;
>>> ++      struct stat oldbuf, newbuf;
>>> ++      int oldrc, newrc;
>>> ++      int save_errno;
>>> ++      int old_db_entry = 0;
>>> +
>>> +-      pseudo_diag("help! unimplemented renameat [%s ->    %s].\n",
>>> oldpath, newpath);
>>> ++      pseudo_debug(2, "renameat: %d,%s->%d,%s\n",
>>> ++              olddirfd, oldpath ? oldpath : "<nil>",
>>> ++              newdirfd, newpath ? newpath : "<nil>");
>>> ++
>>> ++#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
>>> ++      if (olddirfd != AT_FDCWD || newdirfd != AT_FDCWD) {
>>> ++              errno = ENOSYS;
>>> ++              return -1;
>>> ++      }
>>> ++#endif
>>> ++
>>> ++      if (!oldpath || !newpath) {
>>> ++              errno = EFAULT;
>>> ++              return -1;
>>> ++      }
>>> ++
>>> ++      save_errno = errno;
>>> ++
>>> ++#ifdef PSEUDO_NO_REAL_AT_FUNCTIONS
>>> ++      newrc = real_lstat(newpath,&newbuf);
>>> ++      oldrc = real_lstat(oldpath,&oldbuf);
>>> ++#else
>>> ++      oldrc = real___fxstatat(_STAT_VER, olddirfd, oldpath,&oldbuf,
>>> AT_SYMLINK_NOFOLLOW);
>>> ++      newrc = real___fxstatat(_STAT_VER, newdirfd, newpath,&newbuf,
>>> AT_SYMLINK_NOFOLLOW);
>>>
>>> ++#endif
>>> ++
>>> ++      errno = save_errno;
>>> ++
>>> ++      /* newpath must be removed. */
>>> ++      /* as with unlink, we have to mark that the file may get deleted
>>> */
>>> ++      msg = pseudo_client_op_plain(OP_MAY_UNLINK, 0, -1, newdirfd,
>>> newpath, newrc ? NULL :&newbuf);
>>> ++      if (msg&&    msg->result == RESULT_SUCCEED)
>>>
>>> ++              old_db_entry = 1;
>>> +       rc = real_renameat(olddirfd, oldpath, newdirfd, newpath);
>>> ++      save_errno = errno;
>>> ++      if (old_db_entry) {
>>> ++              if (rc == -1) {
>>> ++                      /* since we failed, that wasn't really unlinked --
>>> put
>>> ++                       * it back.
>>> ++                       */
>>> ++                      pseudo_client_op_plain(OP_CANCEL_UNLINK, 0, -1,
>>> newdirfd, newpath,&newbuf);
>>> ++              } else {
>>> ++                      /* confirm that the file was removed */
>>> ++                      pseudo_client_op_plain(OP_DID_UNLINK, 0, -1,
>>> newdirfd, newpath,&newbuf);
>>> ++              }
>>> ++      }
>>> ++      if (rc == -1) {
>>> ++              /* and we're done. */
>>> ++              errno = save_errno;
>>> ++              return rc;
>>> ++      }
>>> ++      save_errno = errno;
>>> ++      /* nothing to do for a "rename" of a link to itself */
>>> ++      if (newrc != -1&&    oldrc != -1&&
>>> ++          newbuf.st_dev == oldbuf.st_dev&&
>>> ++          newbuf.st_ino == oldbuf.st_ino) {
>>> ++              return rc;
>>> ++        }
>>> ++
>>> ++      /* rename(3) is not mv(1).  rename(file, dir) fails; you must
>>> provide
>>> ++       * the corrected path yourself.  You can rename over a directory
>>> only
>>> ++       * if the source is a directory.  Symlinks are simply removed.
>>> ++       *
>>> ++       * If we got here, the real rename call succeeded.  That means
>>> newpath
>>> ++       * has been unlinked and oldpath has been linked to it.
>>> ++       *
>>> ++       * There are a ton of special cases to error check.  I don't check
>>> ++       * for any of them, because in every such case, the underlying
>>> rename
>>> ++       * failed, and there is nothing to do.
>>> ++       * The only tricky part is that, because we used to ignore
>>> symlinks,
>>> ++       * we may have to rename or remove directory trees even though in
>>> ++       * theory rename can never destroy a directory tree.
>>> ++       */
>>> ++      if (!old_db_entry) {
>>> ++              /* create an entry under the old name, which will then be
>>> ++               * renamed; this way, children would get renamed too, if
>>> there
>>> ++               * were any.
>>> ++               */
>>> ++              if (newrc == 0) {
>>> ++                      if (newbuf.st_dev != oldbuf.st_dev) {
>>> ++                              oldbuf.st_dev = newbuf.st_dev;
>>> ++                              oldbuf.st_ino = newbuf.st_ino;
>>> ++                      }
>>> ++              }
>>> ++              pseudo_debug(1, "creating new '%s' [%llu] to rename\n",
>>> ++                      oldpath, (unsigned long long) oldbuf.st_ino);
>>> ++              pseudo_client_op_plain(OP_LINK, 0, -1, olddirfd,
>>> oldpath,&oldbuf);
>>> ++      }
>>> ++      /* special case: use 'fd' for olddirfd, because
>>> ++       * we know it has no other meaning for RENAME
>>> ++       */
>>> ++      pseudo_client_op_plain(OP_RENAME, 0, olddirfd, newdirfd,
>>> newpath,&oldbuf, oldpath);
>>>
>>> +
>>> ++      errno = save_errno;
>>> + /*    return rc;
>>> +  * }
>>> +  */
>>> +diff --git a/pseudo_client.c b/pseudo_client.c
>>> +index 48607c2..4a30420 100644
>>> +--- a/pseudo_client.c
>>> ++++ b/pseudo_client.c
>>> +@@ -988,6 +988,8 @@ base_path(int dirfd, const char *path, int
>>> leave_last) {
>>> +               if (dirfd != -1&&    dirfd != AT_FDCWD) {
>>>
>>> +                       if (dirfd>= 0) {
>>> +                               basepath = fd_path(dirfd);
>>> ++                      }
>>> ++                      if (basepath) {
>>> +                               baselen = strlen(basepath);
>>> +                       } else {
>>> +                               pseudo_diag("got *at() syscall for unknown
>>> directory, fd %d\n", dirfd);
>>> +@@ -1128,7 +1130,10 @@ pseudo_client_op(pseudo_op_t op, int access, int
>>> fd, int dirfd, const char *path
>>> +       if (path) {
>>> +               pseudo_debug(2, " %s", path);
>>> +       }
>>> +-      if (fd != -1) {
>>> ++      /* for OP_RENAME in renameat, "fd" is also used for the
>>> ++       * second dirfd.
>>> ++       */
>>> ++      if (fd != -1&&    op != OP_RENAME) {
>>>
>>> +               pseudo_debug(2, " [fd %d]", fd);
>>> +       }
>>> +       if (buf) {
>>> diff --git a/meta/recipes-devtools/pseudo/pseudo_1.2.bb
>>> b/meta/recipes-devtools/pseudo/pseudo_1.2.bb
>>> index f2ebc22..04bcbce 100644
>>> --- a/meta/recipes-devtools/pseudo/pseudo_1.2.bb
>>> +++ b/meta/recipes-devtools/pseudo/pseudo_1.2.bb
>>> @@ -1,10 +1,12 @@
>>>   require pseudo.inc
>>>
>>> -PR = "r4"
>>> +PR = "r5"
>>>
>>>   SRC_URI =
>>> "http://www.yoctoproject.org/downloads/${BPN}/${BPN}-${PV}.tar.bz2 \
>>>              file://oe-config.patch \
>>> -           file://static_sqlite.patch"
>>> +           file://static_sqlite.patch \
>>> +           file://opendir.patch \
>>> +           file://renameat.patch"
>>>
>>>   SRC_URI[md5sum] = "a2819084bab7e991f06626d02cf55048"
>>>   SRC_URI[sha256sum] =
>>> "4749a22df687f44d24c26e97170d4781a1bd52d5ee092364a40877e4d96ff058"
>



  reply	other threads:[~2012-02-07 16:52 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-02-06  6:40 [PATCH V2 00/20] uclibc upgrade, initial kmod and thumb tune Khem Raj
2012-02-06  6:40 ` [PATCH 01/20] task-core-tools: Divide it into 3 recipes Khem Raj
2012-02-06  6:40 ` [PATCH 02/20] Enable options needed for ltp to compile Khem Raj
2012-02-06  6:40 ` [PATCH 03/20] arm/tune: Correct the logic which added thumb-interwork to OVERRIDES Khem Raj
2012-02-06  6:40 ` [PATCH 04/20] tunearch/arm: Differentiate between thumb code generation and thumb capability Khem Raj
2012-02-06  6:40 ` [PATCH 05/20] tune-thumb.inc: Delete Khem Raj
2012-02-06  6:40 ` [PATCH 06/20] uclibc: Get the thumb features from tune flags Khem Raj
2012-02-06  6:40 ` [PATCH 07/20] kmod: Add recipes Khem Raj
2012-05-03 21:05   ` Darren Hart
2012-05-03 22:02     ` Khem Raj
2012-02-06  6:40 ` [PATCH 08/20] module-init-tools: Delete Khem Raj
2012-05-03 21:07   ` Darren Hart
2012-05-03 21:45     ` Khem Raj
2012-02-06  6:40 ` [PATCH 09/20] image.bbclass, kernel.bbclass: Use kmod-native instead of module-init-tools-cross Khem Raj
2012-05-03 21:09   ` Darren Hart
2012-05-03 21:48     ` Khem Raj
2012-02-06  6:40 ` [PATCH 10/20] pseudo: Wrap renameat and opendir Khem Raj
2012-02-07 16:21   ` Saul Wold
2012-02-07 16:31     ` Khem Raj
2012-02-07 16:43       ` Saul Wold [this message]
2012-02-07 18:10         ` Khem Raj
2012-02-07 23:21         ` Mark Hatle
2012-02-08  2:00           ` Khem Raj
2012-02-06  6:40 ` [PATCH 11/20] uclibc: Upgrade recipes from 0.9.32 -> 0.9.33 Khem Raj
2012-02-07 19:02   ` Saul Wold
2012-02-07 22:26     ` Khem Raj
2012-02-06  6:40 ` [PATCH 12/20] zlib: Upgrade 1.2.5 -> 1.2.6 Khem Raj
2012-02-07  8:08   ` Saul Wold
2012-02-07 15:31     ` Khem Raj
2012-02-07 15:59       ` Saul Wold
2012-02-07 23:12         ` Khem Raj
2012-02-08  0:19           ` Saul Wold
2012-02-08  2:06             ` Khem Raj
2012-02-11  5:05               ` Steve Sakoman
2012-02-11  5:09                 ` Koen Kooi
2012-02-11  8:15                   ` Khem Raj
2012-02-11  8:19                     ` Khem Raj
2012-02-11  8:26                     ` Koen Kooi
2012-02-13  7:48                   ` Martin Jansa
2012-02-13 13:23                     ` Steve Sakoman
2012-02-13 13:33                       ` Martin Jansa
2012-02-13 13:42                       ` Koen Kooi
2012-02-14  4:52                         ` Lu, Lianhao
2012-02-14  6:24                           ` Khem Raj
2012-02-14  9:26                             ` Phil Blundell
2012-02-14  6:53                           ` Martin Jansa
2012-02-14 14:24                             ` Koen Kooi
2012-02-13 15:39                       ` Phil Blundell
2012-02-13 17:09                         ` Khem Raj
2012-02-21 23:04                         ` Richard Purdie
2012-02-21 23:01                       ` Richard Purdie
2012-02-22  8:03                         ` Koen Kooi
2012-02-22 11:08                           ` Richard Purdie
2012-02-06  6:40 ` [PATCH 13/20] runqemu-internal: qemuarm can handle 256M Khem Raj
2012-02-06  6:40 ` [PATCH 14/20] gconf, consolekit: Avoid polkit when compiling with uclibc Khem Raj
2012-02-06  6:40 ` [PATCH 15/20] python: Fix build failure of python-elementtree on x86_64 Khem Raj
2012-02-06  6:40 ` [PATCH 16/20] libdrm: Fix build failure unearthed by uclibc Khem Raj
2012-02-06  6:40 ` [PATCH 17/20] classes, recipes: Replace POKY_* with CORE_IMAGE_* Khem Raj
2012-02-06  6:40 ` [PATCH 18/20] libx11: Backport _XGetRequest API Khem Raj
2012-02-06  6:40 ` [PATCH 19/20] gcc-cross-testing: Fix evaluation of user and target name Khem Raj
2012-02-07 17:21   ` Saul Wold
2012-02-07 18:07     ` Khem Raj
2012-02-07 17:49   ` Otavio Salvador
2012-02-07 18:18     ` Khem Raj
2012-02-06  6:40 ` [PATCH 20/20] mirrors.bbclass: Add yp.org and oe.org to fallback mirrors Khem Raj
2012-02-07 17:49   ` Saul Wold
2012-02-07 18:04     ` Khem Raj
2012-02-08  4:12 ` [PATCH V2 00/20] uclibc upgrade, initial kmod and thumb tune Saul Wold
2012-02-20 12:11   ` Koen Kooi
2012-02-20 16:57     ` Khem Raj

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F3154CD.3000305@linux.intel.com \
    --to=sgw@linux.intel.com \
    --cc=openembedded-core@lists.openembedded.org \
    --cc=raj.khem@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.