On Thu, Sep 18, 2008 at 05:09:35PM +0530, Sadashiiv, Halesh wrote: > From: "Sadashiiv, Halesh" <halesh.sadashiv@xxxxxxxxxxx> > Date: Thu, 18 Sep 2008 17:09:35 +0530 > To: linux-mips@xxxxxxxxxxxxxx > Subject: execve errno setting on MIPS > Content-Type: multipart/alternative; > boundary="----_=_NextPart_001_01C91983.39F24AAB" > > Hi all, > > Please find the below testcase.. > > #include <stdio.h> > #include <limits.h> > #include <errno.h> > #include <unistd.h> > #include <stdlib.h> > #include <string.h> > #include <sys/types.h> > #include <sys/stat.h> > > #define EXE_NAME "./exe" > > char e2BIG[ARG_MAX+1][10]; > char *envList[]={NULL}; > > int main(void) > { > int ret,ind; > > for(ind = 0; ind < ARG_MAX+1; ind++) > strcpy(e2BIG[ind], "helloword"); > > if ((ret = chmod(EXE_NAME,0744)) != 0){ > printf("chmod failed\n"); > exit(1); > } > > /* whne arg list is too long */ > if ((ret = execve(EXE_NAME,e2BIG,envList)) == -1) { > if ( errno == E2BIG) > printf("Test Pass\n"); > else > printf("Test Fail : Got Errno %d\n", errno); > exit(0); > } > else > printf("execve worked out of limit\n"); > exit(1); > } > > On MIPS E2BIG is not getting set as errno instead EFAULT is set, while > on > other archs like ARM, PowerPC and i686 I am able to get E2BIG. > > Please let me know about the issue... > > Let EXE_NAME be any executable.... Let there be light: char *foo[] != char foo[][] char *e2BIG[ARG_MAX + 1] = { [0 ... ARG_MAX] = "helloword" }; for (ind = 0; ind < ARG_MAX + 1; ind++) strcpy(e2BIG[ind], "helloword"); is different from char *e2BIG[ARG_MAX + 1] = { [0 ... ARG_MAX] = "helloword" }; The one is two dimensional array, the other an array of pointers to char. Ralf