无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: chenall
打印 上一主题 下一主题

grub4dos 外部命令 wenv [2010-10-17 ]

  [复制链接]
301#
 楼主| 发表于 2010-10-3 08:11:58 | 只看该作者
原帖由 tuxw 于 2010-10-3 02:54 发表
貌似colinux不能运行在64位系统下
在VMWARE里装个XP,在虚拟机里总算可以编译了(绕了好大一个弯)。但网络不正常,不能下载源码,只能在虚拟机与宿主间倒来倒去了


默认是使用桥接网络的,如果你使用路由器共享上网那就可以直接使用。若是单机拨号连接的,只要设置你的拨号连接为共享应该也就可以了。
回复

使用道具 举报

302#
发表于 2010-10-3 11:06:16 | 只看该作者
是路由器共享上网的,虚拟机本身可以自动连网
有可能是在虚拟机中的原因吧,虚拟机跟宿主机本身是桥接上网的。不知道coLinux在虚拟机里面再桥接有没有问题

这两天仔细看了wenv源码,发现一些问题并修改了,大部分是按个人需求改的,比如命令、变量名长度的严格识别。但有一个地方可能是BUG,在replace_str里面,有个防止缓冲区越界的条件 while (*in && po - out < MAX_ENV_LEN),后面那个条件永远为真的,我觉得应该反过来 out-po。这个BUG比较隐蔽,一般人碰不到,只有变量值比较长,接近最大值,且替换后超过最大值才会越界,但不一定会有明显的症状,要看越界后被覆盖的是什么内容。

目前还没有涉及到calc子命令,因为有些没完全看懂,不能做大动作。
比如 debug 这个变量是从哪里来的?是grub4dos里面的吗?
int flags = (*(int *)(p - 12)); 初始值是谁设定的?从哪里去影响它?
safe_parse_maxint 这个函数的原型定义找了很久,Win7好象不能搜索文件时指定包含的字符,我在grub4dos里面一个文件打开慢慢找才找到。

[ 本帖最后由 tuxw 于 2010-10-3 11:17 编辑 ]
回复

使用道具 举报

303#
 楼主| 发表于 2010-10-3 11:41:49 | 只看该作者
while (*in && po - out < MAX_ENV_LEN)
这确实是一个BUG,你没说我都没有注意。

debug是GRUB4DOS的变量。具体可以看grub4dos.h文件。

以下语句是固定的,用于获取从GRUB4DOS传过来的参数.
void *p = &main;
char *arg = p - (*(int *)(p - 8));
int flags = (*(int *)(p - 12));
arg 是参数。flags是标志,一般代表程序是从哪里执行的,比如从菜单执行或命令行执行的。
flags相关的定义在shared.h文件中

/* The flags for the builtins.  */
#define BUILTIN_CMDLINE                0x1        /* Run in the command-line.  */
#define BUILTIN_MENU                0x2        /* Run in the menu.  */
#define BUILTIN_TITLE                0x4        /* Only for the command title.  */
#define BUILTIN_SCRIPT                0x8        /* Run in the script.  */

通过flags可以限制程序执行,比如不允许在菜单中运行则
if (flags & BUILTIN_MENU) return 0;

用WIN7可以搜的用命令行
进入到GRUB4DOS_SRC\STAGE2目录下。
find "safe_parse_maxint" *.c
还有
find "safe_parse_maxint" *.H
回复

使用道具 举报

304#
发表于 2010-10-3 15:57:29 | 只看该作者
感谢chenall这么详细的回复

用WIN7可以搜的用命令行
进入到GRUB4DOS_SRC\STAGE2目录下。
find "safe_parse_maxint" *.c
还有
find "safe_parse_maxint" *.H

图形界面用惯了,有了惰性。find命令我是知道的,但就是没想到去命令行搜索
回复

使用道具 举报

305#
发表于 2010-10-3 20:48:50 | 只看该作者
这个修改版仍有BUG,最新的修改在 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=159851&page=33#pid2053040


自己编译了个,只涉及wenv,但对grub4dos不熟,不知有没有不良影响,chenall有空时帮忙看看,也希望大家能帮忙测试下。

变化如下:

1.修正了replace_str一个越界的BUG

2.修正了reset命令不能复位标志变量__wenv的BUG

3.修正了set命令变量名后无等号时仍然清除变量的BUG

4.修正了calc命令负数计算BUG

5.子命令calc明确针对32位计算(本想改为64位,但int main()是习惯,改了不知是否带来隐性的不良影响

6.子命令长度须匹配
    WENV gettttt 以前等效于 WENV get

7.变量名必须由非数字开头的字母、数字、下划线组成
8.变量名长度须完全匹配

   WENV set A1234567=1
   WENV set A12345678=2 原来会修改 A1234567
   WENV set A1=5
   WENV set A1()=6 原来会修改 A1

9.默认变量__wenv改为__wenv__, 刚好8个字符可简化判断

10.帮助信息整理,增加了reset

11.子命令出错时只显示该命令的帮助(目前只针对set)

下面这样的简化单目运算还没有实现,有空再弄
  WENV calc ${var}++


2010-10-04 2:14 不好意思,先前上载版本自己就发现问题多多,下面的下载链接已更新,已下载的朋友请重新下载测试。

wenv-tuxw.zip (9.87 KB, 下载次数: 29)

[ 本帖最后由 tuxw 于 2010-10-5 04:21 编辑 ]

Test-2010-10-03-20-45-56.png (17.68 KB, 下载次数: 110)

Test-2010-10-03-20-45-56.png

Test-2010-10-03-20-56-15.png (19.2 KB, 下载次数: 88)

Test-2010-10-03-20-56-15.png
回复

使用道具 举报

306#
发表于 2010-10-3 20:57:23 | 只看该作者
热烈欢迎tuxw加入开发阵营!
这几天试图看懂wenv的源代码,汗!水平有限!

————————————————————————————————————
另>>是移位操作符?如何理解?

[ 本帖最后由 zxw 于 2010-10-3 20:58 编辑 ]
回复

使用道具 举报

307#
发表于 2010-10-3 21:13:01 | 只看该作者
原帖由 zxw 于 2010-10-3 20:57 发表
热烈欢迎tuxw加入开发阵营!
这几天试图看懂wenv的源代码,汗!水平有限!

————————————————————————————————————
另>>是移位操作符?如何理解?


是移位
1-2>>31,因为计算结果是32位的,右移31位后取得符号位,符号位1表示结果是负值,进而判断出前面的1<2。

这个修改版测试时主要针对变量,针对地址的可能还不完善。
回复

使用道具 举报

308#
发表于 2010-10-3 21:15:19 | 只看该作者
支持各位大侠将这个grub4dos做成轻量级OS。
回复

使用道具 举报

309#
发表于 2010-10-3 23:00:48 | 只看该作者
wenv set t1=-1
不显示计算结果,固然美观,但不方便调试。

[ 本帖最后由 zxw 于 2010-10-3 23:10 编辑 ]
回复

使用道具 举报

310#
发表于 2010-10-4 00:19:03 | 只看该作者
原帖由 zxw 于 2010-10-3 23:00 发表
wenv set t1=-1
不显示计算结果,固然美观,但不方便调试。



#305 下载已更新
用命令 debug off/normal/on 改变输出信息级别
回复

使用道具 举报

311#
发表于 2010-10-4 11:15:08 | 只看该作者

回复 #310 tuxw 的帖子

还是有问题。
回复

使用道具 举报

312#
 楼主| 发表于 2010-10-4 16:26:50 | 只看该作者
欢迎tuxw加入....^_^
看了一下加入了很多注释,不错。

总算引出了一块玉,希望更多的人可以加入一起完善。

其实门槛并不高,只要装个可以LINUX用GCC编程就可以了(这都有现成的)。

只要懂些C语言的基础知识,你也可以。因为正常情况下只涉及很简单的语法。
回复

使用道具 举报

313#
发表于 2010-10-4 17:10:41 | 只看该作者
原帖由 zxw 于 2010-10-4 11:15 发表
还是有问题。
100927


按wenv目前的设计结构负数不能直接运算。所我将wenv calc 的运算结果改为补码形式。
前面的 wenv calc 1-2 结果是32位补码,虽然看起来它不是-1,实际上它就是-1。这样改是为了让负数能够进行运算。
回复

使用道具 举报

314#
发表于 2010-10-4 17:11:43 | 只看该作者
原帖由 chenall 于 2010-10-4 16:26 发表
欢迎tuxw加入....^_^
看了一下加入了很多注释,不错。

总算引出了一块玉,希望更多的人可以加入一起完善。

其实门槛并不高,只要装个可以LINUX用GCC编程就可以了(这都有现成的)。

只要懂些C语言的基 ...


玉谈不上,就是在你的基础上学习下
回复

使用道具 举报

315#
 楼主| 发表于 2010-10-4 18:16:19 | 只看该作者
原帖由 tuxw 于 2010-10-4 17:10 发表


按wenv目前的设计结构负数不能直接运算。所我将wenv calc 的运算结果改为补码形式。
前面的 wenv calc 1-2 结果是32位补码,虽然看起来它不是-1,实际上它就是-1。这样改是为了让负数能够进行运算。


WENV 后面的版本是可以计算负数的呀.

看了一下好像你修改的WENV还是之前的版本.

试试我今天上传的WENV.C ,修改了grub_memcmp函数,使得参数可以更匹配
比如wenv getttt就不再相当于wenv get了.
但wenv get= 还是想当于wenv get因为使用了空格和制表符还有"="分隔参数.

在线查看
http://code.google.com/p/grubutils/source/browse/trunk/src/wenv.c

下载源码
http://grubutils.googlecode.com/svn/trunk/src/wenv.c

[ 本帖最后由 chenall 于 2010-10-4 18:17 编辑 ]
回复

使用道具 举报

316#
 楼主| 发表于 2010-10-4 19:50:16 | 只看该作者
晚上有些时间,我准备尝试在WENV中加入字符串提取的功能.(不知晚上能不能搞定)
和LINUX SHELL语法一样.
具体的语法介绍可以先看看这里.
http://blog.csdn.net/gumanren/archive/2010/05/17/5601544.aspx

可能会比较麻烦,先尝试实现其中一两个功能.
回复

使用道具 举报

317#
发表于 2010-10-4 20:32:36 | 只看该作者
莫非C大打算弄出字符串分割?!
太好啦,我正等着您推出
回复

使用道具 举报

318#
发表于 2010-10-4 20:34:29 | 只看该作者
原帖由 chenall 于 2010-10-4 18:16 发表


WENV 后面的版本是可以计算负数的呀.

看了一下好像你修改的WENV还是之前的版本.

试试我今天上传的WENV.C ,修改了grub_memcmp函数,使得参数可以更匹配
比如wenv getttt就不再相当于wenv get了.
但we ...

我是在930之前,svn上的正式版本基础上改的


字符串提取,是个不错的功能
我正在想增加嵌套的功能,如 ${${VAR}},有了嵌套后wenv可以当一个小型的脚本语言来编程了

[ 本帖最后由 tuxw 于 2010-10-4 20:51 编辑 ]
回复

使用道具 举报

319#
 楼主| 发表于 2010-10-4 23:23:25 | 只看该作者
OK,新版已经上传,有条件的可以测试一下看看有没有什么问题.

2010-10-05
   1.添加字符串处理功能,和linux shell类似.
      1).${VAR:x:y}  从x开始提取y个字符,如果x为负数则从倒数x个开始提取.
      
      以下提取的内容都不包含STRING字符串.
      2).${VAR#STRING}        提取STRING字符串后面的内容,从左往右第一个位置开始.
      3).${VAR##STRING} 提取STRING字符串后面的内容,从右往左第一个位置开始.
      4).${VAR%STRING}        提取STRING字符串前面的内容,从右往左第一个位置开始.
      5).${VAR%%STRING}        提取STRING字符串前面的内容,从左往右第一个位置开始.

下载地址:
http://grubutils.googlecode.com

附使用的例子:



[ 本帖最后由 chenall 于 2010-10-5 00:33 编辑 ]
回复

使用道具 举报

320#
 楼主| 发表于 2010-10-4 23:24:53 | 只看该作者
原帖由 tuxw 于 2010-10-4 20:34 发表

我是在930之前,svn上的正式版本基础上改的


字符串提取,是个不错的功能
我正在想增加嵌套的功能,如 ${${VAR}},有了嵌套后wenv可以当一个小型的脚本语言来编程了


呵呵,我9月30日刚好上传了一个新的版本.

嵌套看起来比较复杂,这个就留给你来完成了.
回复

使用道具 举报

321#
 楼主| 发表于 2010-10-5 00:35:45 | 只看该作者
另外请管理员修复一下这个贴子,我看贴子时经常会出现以下提示..

未定义操作,请返回。

把地址栏的page参数减1就可以了.
回复

使用道具 举报

322#
发表于 2010-10-5 01:34:01 | 只看该作者
“未定义操作,请返回。”这种错误我也遇到,在这里分析了原因:
http://bbs.wuyou.net/forum.php?m ... ;page=42#pid2051715
回复

使用道具 举报

323#
发表于 2010-10-5 04:18:20 | 只看该作者
在chenall最新正式版基础上修改了下,chenall已解决 wenv calc 的负数计算问题,所以我的动作就比较小了,引入BUG的机会也小了。

变化如下:

变量名必须由非数字开头的字母、数字、下划线组成(不能以数字开头)
变量名长度须完全匹配
WENV set A12345678 非法,不会匹配  A1234567
WENV set A1- 非法,不会匹配 A1

set命令在debug未关闭时回显结果
set命令变量名后必须有=,WENV set TT 将不会清掉TT
reset命令复位__wenv
reset命令扩展批量清除
WENV reset ABC 等效于 WENV set ABC=
WENV reset ABC* 清理所有 ABC 开头的变量

帮助信息整理,增加了reset,子命令出错只显示该命令帮助
set/calc/run/read命令无参数时,显示相应命令语法

压缩包中包含了一个 W104,是chenall最新的版本,请用 W104 和 WENV 执行相同的命令测试,看看有没有新的BUG。

wenv_tuxw.zip (15.71 KB, 下载次数: 23)

@chenall
请有空时也帮助检查下,如果没问题的话希望能加入到你的正式版中,这样我就可以继续使用你开发的新功能,又能保持自己的需求了。否则每次我svn更新下,我写的注释都丢了,改起来又麻烦了。
这次改动较小,保持了你函数顺序,用比较器能比较松的查看改动的地方。

chenall 新版中set/get都是关闭回显的,所以有个BUG你可能没发现,回显的语句是
    printf("%s=%s",&var,&value);
1.貌似前面的&是不必要的
2.变量名正好8字符时,%s格式显示将出错。如果该变量的后一个位置为空的话它会将下一变量的空字符当结束符时可以正常显示,如下一位置有了变量,get的结果将不正常。

下面这个修改版我加了个 put_var 函数来显示变量名。
同时扩展了 get 命令可以通过前缀批量读取变量。 WENV get ABC* 将显示所有 ABC 开头的变量, get / get ABC* / reset ABC* 增加了变量计数显示。

wenv_tuxw_1005.zip (16.18 KB, 下载次数: 17)

[ 本帖最后由 tuxw 于 2010-10-5 16:10 编辑 ]
回复

使用道具 举报

324#
发表于 2010-10-5 15:34:49 | 只看该作者
字符串处理很完美,也比较容易记忆。+-运算目前也正常了。
不过运算负数可能还有BUG,如:
当然按从左至右运算原则为-10/-2应该不合法,而且除法也很少碰到。但为何*是正常的。

[ 本帖最后由 zhaohj 于 2010-10-5 15:44 编辑 ]

Snap1.jpg (46.38 KB, 下载次数: 117)

/法错误

/法错误

Snap2.jpg (36.19 KB, 下载次数: 104)

*正常

*正常
回复

使用道具 举报

325#
 楼主| 发表于 2010-10-5 16:06:55 | 只看该作者
@tuxw
哇,4点多还在忙....

正在整合,顺便修改了一些小错误.预计晚上可以上传.

@zhaohj
除法错误.汗,不太清楚原因,我查一下.

另外除法还有乘法都是32位的运算.
回复

使用道具 举报

326#
发表于 2010-10-5 16:11:37 | 只看该作者
@chenall
我刚更新了#323的帖子,有个BUG你关注下
回复

使用道具 举报

327#
发表于 2010-10-5 16:15:10 | 只看该作者
目前有了chkpci,有了wenv字符串操作${var:x:y}、${var#Strong}等,找匹配的SRS驱动已成为现实。
如SRSID.TXT
...
PCI\VEN_1000&DEV_0054="lsi_sas"
...
虚拟机的硬件ID匹配这一条,也能成功提取lsi_sas字符串。
----------------------------
目前还缺少对文本文件的操作,read line整行读取,write line整行写入,文本文件字符串替换等。
write file虽然有写入功能,但很难定位。

离我们希望的目标越来越近了!

[ 本帖最后由 zhaohj 于 2010-10-5 16:23 编辑 ]
回复

使用道具 举报

328#
发表于 2010-10-5 16:30:44 | 只看该作者
有个思路供chenall参考下:cat --locate=string,如果支持 双引号 和 \0xXX 定位字符串并将返回值能让wenv读取, 结合write命令就可以操作文件了
回复

使用道具 举报

329#
 楼主| 发表于 2010-10-5 18:21:54 | 只看该作者
chenall 新版中set/get都是关闭回显的,所以有个BUG你可能没发现,回显的语句是
    printf("%s=%s",&var,&value);
1.貌似前面的&是不必要的
2.变量名正好8字符时,%s格式显示将出错。如果该变量的后一个位置为空的话它会将下一变量的空字符当结束符时可以正常显示,如下一位置有了变量,get的结果将不正常。

这个没关系的.
这里的var是wenv_func函数里面的一个变量char var[8];
当在了envi_cmd里面的就可以直接printf了.
回复

使用道具 举报

330#
 楼主| 发表于 2010-10-5 18:25:30 | 只看该作者
目前还缺少对文本文件的操作,read line整行读取,write line整行写入,文本文件字符串替换

读取的比较简单,但写入就麻烦了,因为涉及到文件系统.

目前有替换的功能,但是替换的长度必须一致.cat命令就行了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-27 17:04

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表