+/* removes the authprint trailing when appropriate */
+static void afp_authprint_remove(AFPObj *obj)
+{
+ ASP asp = obj->handle;
+ char addr_filename[256];
+ char addr_filename_buff[256];
+ struct stat cap_st;
+
+ sprintf(addr_filename, "%s/net%d.%dnode%d", obj->options.authprintdir,
+ ntohs( asp->asp_sat.sat_addr.s_net )/256,
+ ntohs( asp->asp_sat.sat_addr.s_net )%256,
+ asp->asp_sat.sat_addr.s_node );
+
+ memset( addr_filename_buff, 0, 256 );
+
+ if(lstat(addr_filename, &cap_st) == 0) {
+ if( S_ISREG(cap_st.st_mode) ) {
+ int len;
+ int capfd = open( addr_filename, O_RDONLY );
+ if ((len = read( capfd, addr_filename_buff, 256 )) > 0) {
+ int file_pid;
+ char *p_filepid;
+ close(capfd);
+ addr_filename_buff[len] = 0;
+ if ( (p_filepid = strrchr(addr_filename_buff, ':')) != NULL) {
+ *p_filepid = '\0';
+ p_filepid++;
+ file_pid = atoi(p_filepid);
+ if (file_pid == (int)getpid()) {
+ if(unlink(addr_filename) == 0) {
+ LOG(log_info, logtype_afpd, "removed %s", addr_filename);
+ } else {
+ LOG(log_info, logtype_afpd, "error removing %s: %s",
+ addr_filename, strerror(errno));
+ }
+ } else {
+ LOG(log_info, logtype_afpd, "%s belongs to another pid %d",
+ addr_filename, file_pid );
+ }
+ } else { /* no pid info */
+ if (unlink(addr_filename) == 0) {
+ LOG(log_info, logtype_afpd, "removed %s", addr_filename );
+ } else {
+ LOG(log_info, logtype_afpd, "error removing %s: %s",
+ addr_filename, strerror(errno));
+ }
+ }
+ } else {
+ LOG(log_info, logtype_afpd, "couldn't read data from %s", addr_filename );
+ }
+ } else {
+ LOG(log_info, logtype_afpd, "%s is not a regular file", addr_filename );
+ }
+ } else {
+ LOG(log_info, logtype_afpd, "error stat'ing %s: %s",
+ addr_filename, strerror(errno));
+ }
+}
+
+/* ------------------------
+ * SIGTERM
+*/