CGI C выводится корректно при выполнении из командной строки, но не из веб-запроса - PullRequest
1 голос
/ 28 декабря 2011

Код:

#include <unistd.h>
#include <stdio.h>

typedef struct hddinfo
{
    char szDevice[4];
    char szMfg[64];
    char szModel[64];
    int nTemp;
} hddinfo;

int main( int argc, char *argv[] )
{

    setuid( 0 );

    hddinfo hdi[4] = {0};

    FILE *fp = popen("/usr/sbin/hddtemp /dev/sd[abcd]","r");
    if( NULL != fp )
    {

        for( int i = 0; i < 4; i++ )
            fscanf( fp,"/dev/%3[^:]: %64s %64[^:]: %d°C\n",&hdi[i].szDevice, &hdi[i].szMfg, &hdi[i].szModel, &hdi[i].nTemp );

        pclose( fp );

        printf( "Content-type: text/html\n\n" );
        printf( "<table id=\"hddtemp\">\n\t<tr>\n\t\t<th>Device</th>\n\t\t<th>Mfg</th>\n\t\t<th>Model</th>\n\t\t<th>Temp</th>\n\t</tr>\n" );
        for( int i = 0; i < 4; i++ )
            printf( "\t<tr>\n\t\t<td>%s</td>\n\t\t<td>%s</td>\n\t\t<td>%s</td>\n\t\t<td>%d&deg;C</td>\n\t</tr>\n", hdi[i].szDevice, hdi[i].szMfg, hdi[i].szModel, hdi[i].nTemp );
        printf( "</table>" );

    }
    else
        printf( "Status: 400 Bad Request\nContent-type: text/html\n\n" );

    return 0;
}

Вывод при запуске из командной строки как www-data пользователь:

<table id="hddtemp">
    <tr>
        <th>Device</th>
        <th>Mfg</th>
        <th>Model</th>
        <th>Temp</th>
    </tr>
    <tr>
        <td>sda</td>
        <td>WDC</td>
        <td>WD2500AAKX-001CA0</td>
        <td>29&deg;C</td>
    </tr>
    <tr>
        <td>sdb</td>
        <td>WDC</td>
        <td>WD20EURS-63S48Y0</td>
        <td>30&deg;C</td>
    </tr>
    <tr>
        <td>sdc</td>
        <td>WDC</td>
        <td>WD20EURS-63S48Y0</td>
        <td>30&deg;C</td>
    </tr>
    <tr>
        <td>sdd</td>
        <td>WDC</td>
        <td>WD20EURS-63S48Y0</td>
        <td>30&deg;C</td>
    </tr>
</table>

Вывод при доступе через веб-браузер:

<table id="hddtemp">
    <tr>
        <th>Device</th>
        <th>Mfg</th>
        <th>Model</th>
        <th>Temp</th>
    </tr>

    <tr>
        <td>sda</td>
        <td>WDC</td>
        <td>WD2500AAKX-001CA0</td>
        <td>29&deg;C</td>
    </tr>

    <tr>
        <td></td>
        <td></td>
        <td></td>
        <td>0&deg;C</td>
    </tr>
    <tr>
        <td></td>

        <td></td>
        <td></td>
        <td>0&deg;C</td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>

        <td>0&deg;C</td>
    </tr>
</table>

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Похоже, у вас есть не-ASCII формат в вашем fscanf вызове (для знака степени).

Вполне вероятно, что на этом ваш синтаксический анализ останавливается из-за LANG=C при выполнении изнутри CGI, в то время как при выполнении в командной строке он установлен на что-то другое.

1 голос
/ 28 декабря 2011

Хорошо, вот я и обнаружил проблему ... По-видимому, всякий раз, когда apache запускает программу для веб-запроса, символ степени не включается, а вместо него включается пробел.Я также могу повторить эту проблему из командной строки, отправив выходные данные в другое приложение, например так:

./hddtemp.cgi | tee

Удаление символа степени исправляет выходные данные для веб-запросов, но затем проблема возникает при вызовах командной строки,Похоже, я застрял с одним или другим работающим.

...