[Armadillo:00315] Re: Armadillo-J での getenv 関数

nakai email@hidden
2005年 5月 26日 (木) 16:53:18 JST


中井です。

回答遅くなりました。

AJでsetenv、getenvは問題なく動きます。
以下にサンプル書きます。

また、thttpdを使用してcgiによりgetenv、setenvを実行するには問題がありました。
cgiでgetenvを実行したところ、必ずnullとなります。
(setenvしてからgetenvでは問題なく変数を取得できます。)

thttpdのソースを見た限りでは、
cgiを実行するとき fork して execve を行なっています。
おそらく execve でうまく環境変数を渡せていないことが原因ではないかと。

cgiでIPアドレスの取得の方法は色々やり方はあると思うのですが、
以下にサンプル書きます。

IPアドレスの設定にも色々あると思います。
例えばsystem関数で以下のようにするとか。

system("fconfig eth0 192.168.0.1");

//////////////////////////////////////////////////////////////
setenv getenv
//////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>

int main(void){
  setenv("AJ_TEST","armadillo-j",0);
  printf("ENV[%s] : %s\n","AJ_TEST",getenv("AJ_TEST"));
  return 0;
}

//////////////////////////////////////////////////////////////
get ip address
//////////////////////////////////////////////////////////////
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>
#include<sys/ioctl.h>
#include<net/if.h>
#include<netdb.h>
#include<arpa/inet.h>

#define DEVICE_NAME "eth0"

int main(void){
  int Socket_FD=0;
  struct sockaddr_in* SocketInfo;
  struct ifreq Request;
  struct in_addr Addr;
  char *IPAddress;

  memset(&Request,0,sizeof(Request));
  memset(&Addr,0,sizeof(Addr));

  Socket_FD=socket(AF_INET,SOCK_DGRAM,0);
  strcpy(Request.ifr_name,DEVICE_NAME);
  
  if(ioctl(Socket_FD,SIOCGIFADDR,&Request)<0){
    perror("ioctl");
    return -1;
  }

  SocketInfo=(struct sockaddr_in*)&Request.ifr_addr;
  
  Addr.s_addr=SocketInfo->sin_addr.s_addr;
  
  IPAddress=inet_ntoa(Addr);
  printf("%s\n",IPAddress);

  return 0;
}



armadillo メーリングリストの案内