Repository 32bit  Forum
Repository 64bit  Wiki

strnstr

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

strnstr

Messaggioda conraid » mar set 30, 2008 16:44

Chiedo aiuto ai programmatori C, io non ci capisco niente

Volevo compilare un programma che fa uso della funziona strnstr. Da quel che ho capito è una funzione compresa nella libreria C BSD, ma non in quella GNU
L'autore del programma mi ha detto di sistemare tramite automake ed autoconf, ma sinceramente non so dove andare a parare

come posso fare?

Tra l'altro avrei il sorgente si strnstr.c

Il pezzo di codice è
Codice: Seleziona tutto
        if (search_string) {
                uint8_t *body;
                uint32_t bodylen;
                if (strnstr((char *)body, search_string, bodylen) == 0) {
                        return (0);
                }

        }



Il config.log mi da questo

Codice: Seleziona tutto
onftest.c:72: undefined reference to `strnstr'
collect2: ld returned 1 exit status
configure:5205: $? = 1
configure: failed program was:
| /* confdefs.h.  */
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE ""
| #define VERSION "1.0"
| #define __USE_BSD 1
| #define HAVE_LIBNSL 1
| #define STDC_HEADERS 1
| #define HAVE_SYS_WAIT_H 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
| #define HAVE_STDLIB_H 1
| #define HAVE_STRING_H 1
| #define HAVE_MEMORY_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_STDINT_H 1
| #define HAVE_UNISTD_H 1
| #define HAVE_FCNTL_H 1
| #define HAVE_SYS_IOCTL_H 1
| #define HAVE_SYS_TIME_H 1
| #define HAVE_UNISTD_H 1
| #define TIME_WITH_SYS_TIME 1
| #define RETSIGTYPE void
| #define HAVE_GETTIMEOFDAY 1
| #define HAVE_SELECT 1
| #define HAVE_SOCKET 1
| #define HAVE_STRDUP 1
| #define HAVE_STRERROR 1
| #define HAVE_STRTOL 1
| #define HAVE_SETEUID 1
| #define HAVE_ERR 1
| #define HAVE_STRSEP 1
| /* end confdefs.h.  */
| /* Define strnstr to an innocuous variant, in case <limits.h> declares strnstr.
|    For example, HP-UX 11i <limits.h> declares gettimeofday.  */
| #define strnstr innocuous_strnstr
|
| /* System header to define __stub macros and hopefully few prototypes,
|     which can conflict with char strnstr (); below.
|     Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
|     <limits.h> exists even on freestanding compilers.  */
|
| #ifdef __STDC__
| # include <limits.h>
| #else
| # include <assert.h>
| #endif
|
| #undef strnstr
|
| /* Override any GCC internal prototype to avoid an error.
|    Use char because int might match the return type of a GCC
|    builtin and then its argument prototype would still apply.  */
| #ifdef __cplusplus
| extern "C"
| #endif
| char strnstr ();
| /* The GNU C library defines this for functions which it implements
|     to always fail with ENOSYS.  Some functions are actually named
|     something starting with __ and the normal name is an alias.  */
| #if defined __stub_strnstr || defined __stub___strnstr
| choke me
| #endif
|
| int
| main ()
| {
| return strnstr ();
|   ;
|   return 0;
| }
configure:5223: result: no

Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: strnstr

Messaggioda targzeta » mar set 30, 2008 17:03

Se mi dai il link ai sorgenti vedo se riesco a compilarlo io.

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: strnstr

Messaggioda Mario Vanoni » mar set 30, 2008 17:15

Scusa Corrado
man strstr
quindi
strcasestr(3)
sotto Linux.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: strnstr

Messaggioda conraid » mar set 30, 2008 17:16

spina ha scritto:Se mi dai il link ai sorgenti vedo se riesco a compilarlo io.

Spina


Ho aggiunto una mia funzione fatta così nel sorgente, secondo te va bene?
Codice: Seleziona tutto
char *
strnstr(const char *body, const char *string_search, size_t bodylen)
{
    char *str = strstr(body, string_search);
    if (!str)
        return NULL;
    if (str-body+strlen(string_search) <= bodylen)
        return str;
    else
        return NULL;
}


da dei warning adesso, ma compila


il programma lo trovi qui
http://monkey.org/~provos/dnsscan-1.0.tar.gz
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: strnstr

Messaggioda conraid » mar set 30, 2008 17:18

Mario Vanoni ha scritto:Scusa Corrado
man strstr
quindi
strcasestr(3)
sotto Linux.


Scusa Mario, strcasestr c'è anche in BSD
dal man di linux
Codice: Seleziona tutto
       The  strstr()  function  finds the first occurrence of the substring needle in the string haystack.  The
       terminating '\0' characters are not compared.

       The strcasestr() function is like strstr(), but ignores the case of both arguments.



mentre invece dal man di BSD

Codice: Seleziona tutto
     The strstr() function locates the first occurrence of the null-terminated
     string s2 in the null-terminated string s1.

     The strcasestr() function is similar to strstr(), but ignores the case of
     both strings.

     The strnstr() function locates the first occurrence of the null-termi-
     nated string s2 in the string s1, where not more than n characters are
     searched.  Characters that appear after a `\0' character are not
     searched.  Since the strnstr() function is a FreeBSD specific API, it
     should only be used when portability is not a concern.
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: strnstr

Messaggioda conraid » mar set 30, 2008 17:20

conraid ha scritto:
Mario Vanoni ha scritto:Scusa Corrado
man strstr
quindi
strcasestr(3)
sotto Linux.


Scusa Mario, strcasestr c'è anche in BSD
dal man di linux
Codice: Seleziona tutto
       The  strstr()  function  finds the first occurrence of the substring needle in the string haystack.  The
       terminating '\0' characters are not compared.

       The strcasestr() function is like strstr(), but ignores the case of both arguments.



mentre invece dal man di BSD

Codice: Seleziona tutto
     The strstr() function locates the first occurrence of the null-terminated
     string s2 in the null-terminated string s1.

     The strcasestr() function is similar to strstr(), but ignores the case of
     both strings.

     The strnstr() function locates the first occurrence of the null-termi-
     nated string s2 in the string s1, where not more than n characters are
     searched.  Characters that appear after a `\0' character are not
     searched.  Since the strnstr() function is a FreeBSD specific API, it
     should only be used when portability is not a concern.


Dove dice chiaramente
Since the strnstr() function is a FreeBSD specific API, it
should only be used when portability is not a concern.
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: strnstr

Messaggioda conraid » mar set 30, 2008 17:24

Questo è il sorgente di strnstr.c su bsd

Codice: Seleziona tutto
#include <sys/types.h>
 #include <string.h>

  char *
  strnstr(const char *s, const char *find, size_t slen)
  {
     char c, sc;
     size_t len;
 
     if ((c = *find++) != '\0') {
        len = strlen(find);
        do {
           do {
              if (slen < 1 || (sc = *s) == '\0')
                return (NULL);
             --slen;
             ++s;
          } while (sc != c);
          if (len > slen)
             return (NULL);
       } while (strncmp(s, find, len) != 0);
       s--;
    }
   return (__DECONST(char *, s));
 }
 
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: strnstr

Messaggioda targzeta » mar set 30, 2008 17:35

Ora sono a lavoro, quando torno a casa provo, ma, come dice il programmatore, è probabile che ti basti usare autoconf e automake.

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: strnstr

Messaggioda Mario Vanoni » mar set 30, 2008 17:50

Scusa Corrado

intendevo
strncasecmp(3)

lapsus linguae
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: strnstr

Messaggioda conraid » mar set 30, 2008 17:56

spina ha scritto:Ora sono a lavoro, quando torno a casa provo, ma, come dice il programmatore, è probabile che ti basti usare autoconf e automake.


ma come? :-(
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: strnstr

Messaggioda conraid » mar set 30, 2008 18:13

Il programmatore mi ha scritto dicendo che come ha cercato di dirmi fino alla noia il programma ha già una funziona chiamata strnstr e si trova nel file strnstr.c, ma io nei sorgenti non lo trovo :-(

Comunque facendo

Codice: Seleziona tutto
 sed -i 's/strnstr/strncasecmp/g' dnsreader.c 


secondo il suggerimento di Mario il sistema compila


Ho riscritto al programmatore, ora mi manda a quel paese :-)
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: strnstr

Messaggioda targzeta » mar set 30, 2008 19:49

conraid ha scritto:
spina ha scritto:Ora sono a lavoro, quando torno a casa provo, ma, come dice il programmatore, è probabile che ti basti usare autoconf e automake.


ma come? :-(

Entra nella directory dei sorgenti e fai
Codice: Seleziona tutto
autoreconf
configure
make
Dovrebbe bastare,
Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: strnstr

Messaggioda conraid » mar set 30, 2008 19:54

spina ha scritto:Entra nella directory dei sorgenti e fai
Codice: Seleziona tutto
autoreconf
configure
make
Dovrebbe bastare,
Spina


No, da lo stesso errore
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: strnstr

Messaggioda targzeta » mar set 30, 2008 20:32

conraid ha scritto:...
No, da lo stesso errore
Si, hai ragione!!! Dopo aver compilato e installato libevent e libdnet con grande soddisfazione ho scoperto che anche a me da lo stesso errore :D.
Sembra che il codice non tenga conto della mancanza della strnstr, nonostante il configure.in ne lo faccia. Bhò.

Spina
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6185
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: strnstr

Messaggioda conraid » mar set 30, 2008 20:33

spina ha scritto:
conraid ha scritto:...
No, da lo stesso errore
Si, hai ragione!!! Dopo aver compilato e installato libevent e libdnet con grande soddisfazione ho scoperto che anche a me da lo stesso errore :D.
Sembra che il codice non tenga conto della mancanza della strnstr, nonostante il configure.in ne lo faccia. Bhò.

Spina


Secondo l'autore dovrebbe esserci un file strnstr.c e mi ha detto che me l'ha ripetuto fino alla noia.
Tu lo vedi?
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti