In snmpd.c there is the following, rather odd piece of code:

   if (pid_file != NULL) {
        /*
         * unlink the pid_file, if it exists, prior to open.  Without
         * doing this the open will fail if the user specified pid_file
         * already exists.
         */
        unlink(pid_file);
        fd = open(pid_file, O_CREAT | O_EXCL | O_WRONLY, 0600);
        if (fd == -1) {
            snmp_log_perror(pid_file);
            if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID, 
                                        NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
                exit(1);
            }
        } else {
            if ((PID = fdopen(fd, "w")) == NULL) {
                snmp_log_perror(pid_file);
                exit(1);
            } else {
                fprintf(PID, "%d\n", (int) getpid());
                fclose(PID);
            }
            close(fd);
        }
    }

What is the purpose of unlink followed by open(,O_CREAT|O_EXCL,)?
Why not use just open(,O_CREAT|O_TRUNC,)?

Why is it not an error to fail to open the pid file if the agent runs
without root access?

I posit that this code is equivalent to the one above (sans a small race
window and the removal of the non-root pid file special handling)

if ((PID=fopen(pid_file, "w")) == NULL) {
    snmp_log_perror(pid_file);
    exit(1);
} else {
    fprintf(PID, "%d\n", (int) getpid());
    fclose(PID);
}

/MF


------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Net-snmp-coders mailing list
Net-snmp-coders@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders

Reply via email to