/* Copyright (C) 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ #include <errno.h>
#include <unistd.h> #include <sysdep.h>
#include <alloca.h>
#include <sys/syscall.h>
#include <bp-checks.h>
#include <stdio.h> int
__execve (file, argv, envp)
const char *file;
char *const argv[];
char *const envp[];
{
#if __BOUNDED_POINTERS__
{
printf("__BOUNDED_POINTERS__,-powered by elliot4718");
char *const *v;
int i;
char *__unbounded *__unbounded ubp_argv;
char *__unbounded *__unbounded ubp_envp;
char *__unbounded *__unbounded ubp_v; for (v = argv; *v; v++)
;
i = v - argv + ;
ubp_argv = (char *__unbounded *__unbounded) alloca (sizeof (*ubp_argv) * i);
for (v = argv, ubp_v = ubp_argv; --i; v++, ubp_v++)
*ubp_v = CHECK_STRING (*v);
*ubp_v = ; for (v = envp; *v; v++)
;
i = v - envp + ;
ubp_envp = (char *__unbounded *__unbounded) alloca (sizeof (*ubp_envp) * i);
for (v = envp, ubp_v = ubp_envp; --i; v++, ubp_v++)
*ubp_v = CHECK_STRING (*v);
*ubp_v = ; return INLINE_SYSCALL (execve, , CHECK_STRING (file), ubp_argv, ubp_envp);
}
#else
printf("__NONONONONONONO__,-powered by elliot4718"); return INLINE_SYSCALL (execve, , file, argv, envp);
#endif
}
weak_alias (__execve, execve)
/* Copyright (C) 1991,92, 1995-99, 2002, 2004, 2005, 2007, 2009
Free Software Foundation, Inc.
This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */ #include <alloca.h>
#include <unistd.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <paths.h> /* The file is accessible but it is not an executable file. Invoke
the shell to interpret it as a script. */
static void
internal_function
scripts_argv (const char *file, char *const argv[], int argc, char **new_argv)
{
/* Construct an argument list for the shell. */
new_argv[] = (char *) _PATH_BSHELL;
new_argv[] = (char *) file;
while (argc > )
{
new_argv[argc] = argv[argc - ];
--argc;
}
} /* Execute FILE, searching in the `PATH' environment variable if it contains
no slashes, with arguments ARGV and environment from ENVP. */
int
__execvpe (file, argv, envp)
const char *file;
char *const argv[];
char *const envp[];
{
if (*file == '\0')
{
/* We check the simple case first. */
__set_errno (ENOENT);
return -;
} if (strchr (file, '/') != NULL)
{
/* Don't search when it contains a slash. */
__execve (file, argv, envp); if (errno == ENOEXEC)
{
/* Count the arguments. */
int argc = ;
while (argv[argc++])
;
size_t len = (argc + ) * sizeof (char *);
char **script_argv;
void *ptr = NULL;
if (__libc_use_alloca (len))
script_argv = alloca (len);
else
script_argv = ptr = malloc (len); if (script_argv != NULL)
{
scripts_argv (file, argv, argc, script_argv);
__execve (script_argv[], script_argv, envp); free (ptr);
}
}
}
else
{
size_t pathlen;
size_t alloclen = ;
char *path = getenv ("PATH");
if (path == NULL)
{
pathlen = confstr (_CS_PATH, (char *) NULL, );
alloclen = pathlen + ;
}
else
pathlen = strlen (path); size_t len = strlen (file) + ;
alloclen += pathlen + len + ; char *name;
char *path_malloc = NULL;
if (__libc_use_alloca (alloclen))
name = alloca (alloclen);
else
{
path_malloc = name = malloc (alloclen);
if (name == NULL)
return -;
} if (path == NULL)
{
/* There is no `PATH' in the environment.
The default search path is the current directory
followed by the path `confstr' returns for `_CS_PATH'. */
path = name + pathlen + len + ;
path[] = ':';
(void) confstr (_CS_PATH, path + , pathlen);
} /* Copy the file name at the top. */
name = (char *) memcpy (name + pathlen + , file, len);
/* And add the slash. */
*--name = '/'; char **script_argv = NULL;
void *script_argv_malloc = NULL;
bool got_eacces = false;
char *p = path;
do
{
char *startp; path = p;
p = __strchrnul (path, ':'); if (p == path)
/* Two adjacent colons, or a colon at the beginning or the end
of `PATH' means to search the current directory. */
startp = name + ;
else
startp = (char *) memcpy (name - (p - path), path, p - path); /* Try to execute this name. If it works, execve will not return. */
__execve (startp, argv, envp); if (errno == ENOEXEC)
{
if (script_argv == NULL)
{
/* Count the arguments. */
int argc = ;
while (argv[argc++])
;
size_t arglen = (argc + ) * sizeof (char *);
if (__libc_use_alloca (alloclen + arglen))
script_argv = alloca (arglen);
else
script_argv = script_argv_malloc = malloc (arglen);
if (script_argv == NULL)
{
/* A possible EACCES error is not as important as
the ENOMEM. */
got_eacces = false;
break;
}
scripts_argv (startp, argv, argc, script_argv);
} __execve (script_argv[], script_argv, envp);
} switch (errno)
{
case EACCES:
/* Record the we got a `Permission denied' error. If we end
up finding no executable we can use, we want to diagnose
that we did find one but were denied access. */
got_eacces = true;
case ENOENT:
case ESTALE:
case ENOTDIR:
/* Those errors indicate the file is missing or not executable
by us, in which case we want to just try the next path
directory. */
case ENODEV:
case ETIMEDOUT:
/* Some strange filesystems like AFS return even
stranger error numbers. They cannot reasonably mean
anything else so ignore those, too. */
break; default:
/* Some other error means we found an executable file, but
something went wrong executing it; return the error to our
caller. */
return -;
}
}
while (*p++ != '\0'); /* We tried every element and none of them worked. */
if (got_eacces)
/* At least one failure was due to permissions, so report that
error. */
__set_errno (EACCES); free (script_argv_malloc);
free (path_malloc);
} /* Return the error from the last attempt (probably ENOENT). */
return -;
}
weak_alias (__execvpe, execvpe)

在execve中为了寻找argv对字符串的解析,直接不给力。最后找到了execvp的代码,原来就是这么简单。。。。

execve(file, argv, env)参数argv获取字符串个数的更多相关文章

  1. golang 中获取字符串个数

    golang 中获取字符串个数 在 golang 中不能直接用 len 函数来统计字符串长度,查看了下源码发现字符串是以 UTF-8 为格式存储的,说明 len 函数是取得包含 byte 的个数 // ...

  2. C关键字typedef及argc,argv,env参数含义

    C关键字typedef--为C中各种数据类型定义别名. 在此插一点C知识 int main(int argc,const char *argv[],const char *envp[])主函数的红色部 ...

  3. (转)Shell中获取字符串长度的七种方法

    Shell中获取字符串长度的七种方法 原文:http://blog.csdn.net/jerry_1126/article/details/51835119 求字符串操作在shell脚本中很常用,下面 ...

  4. Shell获取字符串长度的多种方法总结

    摘自:https://www.jb51.net/article/121290.htm 前言 我们在日常工作中,对于求字符串操作在shell脚本中很常用,实现的方法有很多种,下面就来给大家归纳.汇总了求 ...

  5. python(38):sys.argv,sys.argv.pop(),获取用户的外部输入,非指定

    见下面的例子(一): # /usr/bin/env python # coding=utf8 import os import requests import sys if __name__ == & ...

  6. shell脚本中,将所有的参数值否赋给一个变量或者说将所有的参数合成一个字符串,获取所有参数

    需求描述: 在写脚本的过程中,遇到这样的一个需求,将脚本执行过程中,传递给 脚本的所有的参数,都赋值给一个变量然后在对这个变量进行处理. 测试过程: 通过以下的脚本将所有传递给脚本的变量都赋值一个变量 ...

  7. nodejs中命令行中参数的获取和解析

    首先,假设有如下的命令行 node  abc.js arg1 arg2 arg3,现在想在abc.js中获取后面的参数arg1.arg2.arg3… var args = process.argv.s ...

  8. SpringMVC请求参数的获取方式

    一.GET请求参数获取 1. 通过HttpServletRequest获取参数 2. 直接方法参数获取 3. RequestParam注解方式获取请求参数 4. Bean方式获取参数 5. Model ...

  9. [No0000A4]DOS命令(cmd)批处理:替换字符串、截取字符串、扩充字符串、获取字符串长度

    1.替换字符串,即将某一字符串中的特定字符或字符串替换为给定的字符串.举例说明其功能:========================================= @echo off set a ...

随机推荐

  1. processModel与ASP.NET进程模型

    配置 Microsoft Internet 信息服务 (IIS) Web 服务器上的 ASP.NET 进程模型设置.其作用是配置IIS或IIS中的应用程序池(IIS7及以后版本)的安全性,性能,健壮性 ...

  2. 背水一战 Windows 10 (13) - 绘图: Stroke, Brush

    [源码下载] 背水一战 Windows 10 (13) - 绘图: Stroke, Brush 作者:webabcd 介绍背水一战 Windows 10 之 绘图 Stroke - 笔划 Brush ...

  3. Andriod小项目——在线音乐播放器

    转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...

  4. php rsa加密解密实例

    1.加密解密的第一步是生成公钥.私钥对,私钥加密的内容能通过公钥解密(反过来亦可以) 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin ...

  5. C++_系列自学课程_第_7_课_数组_《C++ Primer 第四版》

    说到数组,大家应该都很熟悉,在C.Pascal.Java等语言中,都有数组的概念.在C++中也提供了对数组的支持.数组简单来说就是一堆相同 数据类型对象的集合. 这里要把握住两个要点: 相同的数据类型 ...

  6. VBA初试——合并

    今天遇到一个任务,要把excel中的相同行合并:没有找到直接的办法(vlookup大概能做),试了试VBA挺好用 数据结构 第一.二列是描述字段,第二列元素唯一:第三到第八列是标志位 任务 合并描述字 ...

  7. [moka同学笔记]Linux命令基本格式及目录处理命令

    命令提示符 [root@localhost ~]# root:当前登录用户localhost:主机名~:当前所在的目录,此处为"家"目录#:root超级用户的提示符,如果是普通用户 ...

  8. VS2015开发Android,自带模拟器无法调试、加载程序,算是坑吗

    VS2015出来后,确定变化很大,什么android.ios的,不在话下.对于我这样传统型的人,也第一时间试用了一下(vs2003->vs2008->vs2012->vs2015). ...

  9. 第一个Java程序HelloWorld

    代码如下: // 一个文件中只能有一个共有的类,并且与文件名称一致,大小写注意 public class HelloWorld{// 程序的入口public static void main(Stri ...

  10. 【grunt第三弹】grunt在前端实际项目中的应用

    前言 [grunt第二弹]30分钟学会使用grunt打包前端代码(02) [grunt第一弹]30分钟学会使用grunt打包前端代码 经过前两次的学习,我们了解了grunt打包的一些基础知识,对于压缩 ...