What is the difference between crypt in unistd.h and crypt.h?












0















crypt has two definitions, from the docs,





  1. One of them uses unistd.h



    #define _XOPEN_SOURCE       /* See feature_test_macros(7) */
    #include <unistd.h>


    This is defined as



    #ifdef __USE_MISC
    /* One-way hash PHRASE, returning a string suitable for storage in the
    user database. SALT selects the one-way function to use, and
    ensures that no two users' hashes are the same, even if they use
    the same passphrase. The return value points to static storage
    which will be overwritten by the next call to crypt. */
    extern char *crypt (const char *__key, const char *__salt)
    __THROW __nonnull ((1, 2));
    #endif



  2. One of them uses GNU crypt.h



    #define _GNU_SOURCE         /* See feature_test_macros(7) */
    #include <crypt.h>


    This is defined as



    /* One-way hash PHRASE, returning a string suitable for storage in the
    user database. SALT selects the one-way function to use, and
    ensures that no two users' hashes are the same, even if they use
    the same passphrase. The return value points to static storage
    which will be overwritten by the next call to crypt. */

    extern char *crypt (const char *__phrase, const char *__salt)
    __THROW __nonnull ((1, 2));





ℹ This question is different from my question here where I'm merely asking about compilation with the unistd.h version










share|improve this question

























  • This is a question about C, not about Linux usage or administration.

    – Gilles
    6 mins ago











  • fair enough @Gilles

    – Evan Carroll
    4 mins ago
















0















crypt has two definitions, from the docs,





  1. One of them uses unistd.h



    #define _XOPEN_SOURCE       /* See feature_test_macros(7) */
    #include <unistd.h>


    This is defined as



    #ifdef __USE_MISC
    /* One-way hash PHRASE, returning a string suitable for storage in the
    user database. SALT selects the one-way function to use, and
    ensures that no two users' hashes are the same, even if they use
    the same passphrase. The return value points to static storage
    which will be overwritten by the next call to crypt. */
    extern char *crypt (const char *__key, const char *__salt)
    __THROW __nonnull ((1, 2));
    #endif



  2. One of them uses GNU crypt.h



    #define _GNU_SOURCE         /* See feature_test_macros(7) */
    #include <crypt.h>


    This is defined as



    /* One-way hash PHRASE, returning a string suitable for storage in the
    user database. SALT selects the one-way function to use, and
    ensures that no two users' hashes are the same, even if they use
    the same passphrase. The return value points to static storage
    which will be overwritten by the next call to crypt. */

    extern char *crypt (const char *__phrase, const char *__salt)
    __THROW __nonnull ((1, 2));





ℹ This question is different from my question here where I'm merely asking about compilation with the unistd.h version










share|improve this question

























  • This is a question about C, not about Linux usage or administration.

    – Gilles
    6 mins ago











  • fair enough @Gilles

    – Evan Carroll
    4 mins ago














0












0








0








crypt has two definitions, from the docs,





  1. One of them uses unistd.h



    #define _XOPEN_SOURCE       /* See feature_test_macros(7) */
    #include <unistd.h>


    This is defined as



    #ifdef __USE_MISC
    /* One-way hash PHRASE, returning a string suitable for storage in the
    user database. SALT selects the one-way function to use, and
    ensures that no two users' hashes are the same, even if they use
    the same passphrase. The return value points to static storage
    which will be overwritten by the next call to crypt. */
    extern char *crypt (const char *__key, const char *__salt)
    __THROW __nonnull ((1, 2));
    #endif



  2. One of them uses GNU crypt.h



    #define _GNU_SOURCE         /* See feature_test_macros(7) */
    #include <crypt.h>


    This is defined as



    /* One-way hash PHRASE, returning a string suitable for storage in the
    user database. SALT selects the one-way function to use, and
    ensures that no two users' hashes are the same, even if they use
    the same passphrase. The return value points to static storage
    which will be overwritten by the next call to crypt. */

    extern char *crypt (const char *__phrase, const char *__salt)
    __THROW __nonnull ((1, 2));





ℹ This question is different from my question here where I'm merely asking about compilation with the unistd.h version










share|improve this question
















crypt has two definitions, from the docs,





  1. One of them uses unistd.h



    #define _XOPEN_SOURCE       /* See feature_test_macros(7) */
    #include <unistd.h>


    This is defined as



    #ifdef __USE_MISC
    /* One-way hash PHRASE, returning a string suitable for storage in the
    user database. SALT selects the one-way function to use, and
    ensures that no two users' hashes are the same, even if they use
    the same passphrase. The return value points to static storage
    which will be overwritten by the next call to crypt. */
    extern char *crypt (const char *__key, const char *__salt)
    __THROW __nonnull ((1, 2));
    #endif



  2. One of them uses GNU crypt.h



    #define _GNU_SOURCE         /* See feature_test_macros(7) */
    #include <crypt.h>


    This is defined as



    /* One-way hash PHRASE, returning a string suitable for storage in the
    user database. SALT selects the one-way function to use, and
    ensures that no two users' hashes are the same, even if they use
    the same passphrase. The return value points to static storage
    which will be overwritten by the next call to crypt. */

    extern char *crypt (const char *__phrase, const char *__salt)
    __THROW __nonnull ((1, 2));





ℹ This question is different from my question here where I'm merely asking about compilation with the unistd.h version







compiling c posix crypt






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 3 mins ago







Evan Carroll

















asked 12 mins ago









Evan CarrollEvan Carroll

5,504114381




5,504114381













  • This is a question about C, not about Linux usage or administration.

    – Gilles
    6 mins ago











  • fair enough @Gilles

    – Evan Carroll
    4 mins ago



















  • This is a question about C, not about Linux usage or administration.

    – Gilles
    6 mins ago











  • fair enough @Gilles

    – Evan Carroll
    4 mins ago

















This is a question about C, not about Linux usage or administration.

– Gilles
6 mins ago





This is a question about C, not about Linux usage or administration.

– Gilles
6 mins ago













fair enough @Gilles

– Evan Carroll
4 mins ago





fair enough @Gilles

– Evan Carroll
4 mins ago










1 Answer
1






active

oldest

votes


















0














These are two declarations, not two definitions. The content of the header file has no impact on which definition of a function is included: this is determined by the linker. There is only one definition of the crypt function in the Unix C standard library, it's whatever the symbol crypt points to in libcrypt.a or libcrypt.so (depending on whether you link statically or dynamically).



Since the two declarations are compatible, it doesn't matter which header a program gets its through. It's also fine if both declarations are processed: a program can contain any number of declarations for a function as long as they're compatible. Without going into the exact details (refer to the C language specification), two function declarations are compatible if they have the same return type, the same number of arguments and the same type for each argument. The name of the argument given in a declaration is not significant.





share























    Your Answer








    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "106"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: false,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: null,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f498074%2fwhat-is-the-difference-between-crypt-in-unistd-h-and-crypt-h%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    These are two declarations, not two definitions. The content of the header file has no impact on which definition of a function is included: this is determined by the linker. There is only one definition of the crypt function in the Unix C standard library, it's whatever the symbol crypt points to in libcrypt.a or libcrypt.so (depending on whether you link statically or dynamically).



    Since the two declarations are compatible, it doesn't matter which header a program gets its through. It's also fine if both declarations are processed: a program can contain any number of declarations for a function as long as they're compatible. Without going into the exact details (refer to the C language specification), two function declarations are compatible if they have the same return type, the same number of arguments and the same type for each argument. The name of the argument given in a declaration is not significant.





    share




























      0














      These are two declarations, not two definitions. The content of the header file has no impact on which definition of a function is included: this is determined by the linker. There is only one definition of the crypt function in the Unix C standard library, it's whatever the symbol crypt points to in libcrypt.a or libcrypt.so (depending on whether you link statically or dynamically).



      Since the two declarations are compatible, it doesn't matter which header a program gets its through. It's also fine if both declarations are processed: a program can contain any number of declarations for a function as long as they're compatible. Without going into the exact details (refer to the C language specification), two function declarations are compatible if they have the same return type, the same number of arguments and the same type for each argument. The name of the argument given in a declaration is not significant.





      share


























        0












        0








        0







        These are two declarations, not two definitions. The content of the header file has no impact on which definition of a function is included: this is determined by the linker. There is only one definition of the crypt function in the Unix C standard library, it's whatever the symbol crypt points to in libcrypt.a or libcrypt.so (depending on whether you link statically or dynamically).



        Since the two declarations are compatible, it doesn't matter which header a program gets its through. It's also fine if both declarations are processed: a program can contain any number of declarations for a function as long as they're compatible. Without going into the exact details (refer to the C language specification), two function declarations are compatible if they have the same return type, the same number of arguments and the same type for each argument. The name of the argument given in a declaration is not significant.





        share













        These are two declarations, not two definitions. The content of the header file has no impact on which definition of a function is included: this is determined by the linker. There is only one definition of the crypt function in the Unix C standard library, it's whatever the symbol crypt points to in libcrypt.a or libcrypt.so (depending on whether you link statically or dynamically).



        Since the two declarations are compatible, it doesn't matter which header a program gets its through. It's also fine if both declarations are processed: a program can contain any number of declarations for a function as long as they're compatible. Without going into the exact details (refer to the C language specification), two function declarations are compatible if they have the same return type, the same number of arguments and the same type for each argument. The name of the argument given in a declaration is not significant.






        share











        share


        share










        answered 1 min ago









        GillesGilles

        534k12810791596




        534k12810791596






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Unix & Linux Stack Exchange!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f498074%2fwhat-is-the-difference-between-crypt-in-unistd-h-and-crypt-h%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Loup dans la culture

            How to solve the problem of ntp “Unable to contact time server” from KDE?

            Connection limited (no internet access)